WPF的DataContext问题

时间:2011-08-18 15:51:15

标签: c# wpf xaml datacontext

我问过它如何与INotifyPropertyChanged接口(How does WPF INotifyPropertyChanged work?)一起使用,它要求我将XAML的DataContext连接到INotifyPropertyChanged继承实例,如下所示。

MainViewModel model = new MainViewModel();        
this.DataContext = model;

我还建议对每个XMAL使用的DataContext发表评论(http://joshsmithonwpf.wordpress.com/2009/10/24/xaml-tip-datacontext-comment/)。

当我有多个XAML文件时,以及当我想将DataContext链接到不同的ViewModel时,我想我需要让每个XAML.CS文件包含这个代码(模型因每个xaml.cs而异):{{ 1}}。

  • 这是对的吗?
  • 如何在XAML文件中执行相同的操作?
  • 这个DataContext背后的魔力是什么?我的意思是,DataContext是如何工作的?

3 个答案:

答案 0 :(得分:2)

DataContext实际上是WPF中绑定系统的主要关键之一。当您设计View(XAML)时,您正在设置数据绑定,但这些都是按名称完成的(实际上,作为字符串)。视觉层次结构中“最近的”DataContext是WPF用于查找匹配属性(按名称)并连接绑定的对象。

建立评论的建议很好 - 它有帮助,因为所选的名称实际上取决于ViewModel(DataContext),因此View的XAML文件实际上与特定类型的{{{ 1}}。

另请注意,除了在代码中设置DataContext之外,还有其他可用于连接DataContext的方法,包括使用定位器,DataTemplates,直接在XAML中设置等等。

答案 1 :(得分:1)

  • 是的,这是正确的,据我所知,因为这是非常重复的一些MVVM框架为你做这个链接。

  • 在XAML中:

    <UserControl ...
                 xmlns:vm="clr-namespace:MyApp.ViewModels">
        <UserControl.DataContext>
            <vm:MyViewModel />
        </UserControl.DataContext>
        <!-- ... -->
    </UserControl>
    
  • 它启用了Path相对于DataContext的短绑定,例如: {Binding Name}绑定到DataContext.Name。它也是遗传的,可能很有用。

如果您没有,请阅读Data Binding Overview

答案 2 :(得分:0)

1 - INotifyPropertyChanged界面更新了对UI的属性更改

公共事件PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

2-我们可以使用两种方式将数据上下文设置为视图,一种选择是在代码隐藏文件中设置上下文,但这与视图紧密耦合并且它不是一个好方法,我建议如下选项,它与视图松散耦合

<UserControl ...
         xmlns:vm="clr-namespace:MyApp.ViewModels">
<UserControl.DataContext>
    <vm:MyViewModel />
</UserControl.DataContext>
<!-- ... -->