C#WPF如何拥有多个DataContext

时间:2017-08-09 07:54:36

标签: c# wpf mvvm

我是WPF的新手,所以尽管找到了其他类似的线程,但我的代码有点不同,所以我不知道如何将这些解决方案应用到我的。

<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 = this。如果我没有注释掉并删除其他DataContext,那么我的SortVariables变量将取复选框的值。如果我有按钮单击的其他DataContext,则复选框将不会绑定。我需要它绑定,因为我将它作为参数传递给DataCompareVM()。

我是WPF和MVVM的新手,请原谅我的无知。

2 个答案:

答案 0 :(得分:1)

对于WPF控件,您不能拥有多个DataContext,您应该将属性移动到ViewModel。

答案 1 :(得分:1)

是的,您可以为不同的元素提供不同的数据上下文。但是在这里你试图替换相同的窗口数据上下文。

您可以使用指定的元素。用以下内容替换您的注释行:

sortChk.DataContext = this;

现在,最长的答案是:你在这里并没有真正做MVVM。正如Fildor所提到的,您应该将SortVariables属性移动到DataCompareVM ViewModel。

由于您似乎在与MVVM斗争,我相信阅读我的介绍性书籍将帮助您顺利完成任务:Learn WPF MVVM