2017-08-09 56 views
0

我對WPF很新,所以儘管發現了其他類似的線程,我的代碼有點不同,所以我不知道如何將這些解決方案應用到我的。C#WPF我怎麼能有多個DataContext

<grid> 
    <CheckBox 
     x:Name="sortChk" 
     Content="Sort Variables" 
     IsChecked="{Binding SortVariables}" 
    /> 
    <b:FlatButton Command="{Binding ClickCommand}"> 
      <TextBlock Text="Compare" FontSize="13"></TextBlock> 
    </b:FlatButton> 

</grid> 

後面的代碼看起來是這樣的

string dataset1FullPath = null; 
string dataset2FullPath = null; 
string dataset1FilePath = null; 
string dataset2FilePath = null; 
public bool SortVariables { get; set; } 

public SingleCompareWindow(string path1, string path2) 
{ 
    InitializeComponent(); 

    dataset1FullPath = path1; 
    dataset2FullPath = path2; 
    dataset1FilePath = System.IO.Path.GetDirectoryName(path1); 
    dataset2FilePath = System.IO.Path.GetDirectoryName(path2); 

    //DataContext = this; 
    DataContext = new DataCompareVM(dataset1FullPath, dataset2FullPath, dataset1FilePath, dataset2FilePath, SortVariables); 
} 

你可以看到,我已註釋掉的DataContext =此。如果我不發表評論並刪除其他DataContext,那麼我的SortVariables變量將取出複選框的值。如果我有其他的DataContext用於點擊按鈕,那麼複選框將不會綁定。我需要它綁定,因爲我將它作爲參數傳遞給DataCompareVM()。

我對WPF和MVVM很陌生,所以原諒我的無知。

+0

如果您希望您的複選框綁定到那裏,則'SortVariables'應該是DataCompareVM的一個屬性。雙擊綁定然後將複選框勾選/未勾選時,更新ViewModel中的Property的值。還要記住在設置不同的值時引發propertychanged事件。 – Fildor

+0

我做到了,它的工作原理。謝謝! – nerdalert

回答

0

對於WPF控件你不能有多個DataContext,你應該將你的屬性移動到ViewModel。

+1

那麼,你可以設置一個孩子控制到一個不同的DC ...並不是完全設置兩個DC來控制,但仍然... – Fildor

+1

是的,你可以做到這一點,但是因爲他使用MVVM模式,如果他使用了一個DataContext。 –

+1

我完全同意。我只想說,如果我們想要挑剔,那麼在單個控件中使用多個DataContext確實是可能的。我不是說「你應該」:) – Fildor

1

是的,你可以爲不同的元素有不同的數據上下文。但是,在這裏你正試圖替換相同的窗口數據上下文。

你可以做的是使用指定的元素。替換你的評論行:

sortChk.DataContext = this; 

現在,最長的答案:你真的沒有在這裏做MVVM。正如Fildor提到的,您應該將SortVariables屬性移動到DataCompareVM ViewModel。

由於您似乎正在與MVVM苦苦掙扎,所以我相信閱讀我的介紹性書籍可以幫助您理清正確:Learn WPF MVVM

+0

我將SortVariables屬性移動到DataCompareVM,它正在按照我的要求工作。謝謝。出於好奇心,因爲我是MVVM的新手,事實是我將參數傳遞給DataCompreVM(...我的參數...)打破了MVVM模式? – nerdalert

+0

不。MVVM模式是一個社區構建模式,它有很多變體。您的路徑參數不會中斷MVVM模式。 –