我有一个工作程序,其中视图模型将数据提供给视图。这在构造函数中完成,也在 Refresh()方法中完成,如下所示。我通常会将一个私有属性引用到视图模型,因为我想在与它进行通信时省略强制转换。
public class TheView
{
private ViewModel TheViewModel { get; set; }
public TheView()
{
TheViewModel = new ViewModel();
DataContext = TheViewModel;
}
public Refresh()
{
TheViewModel = new ViewModel();
DataContext = TheViewModel;
}
}
然后,我已经准备好并开始追逐线条了。由于构造函数将 DataContext 连接到属性 TheViewModel ,我想我可以分配给后者,而前者会自己更新它的内容。令我失望的是,我发现它并非如此。以下为我提供正确的对象列表但 DataContext 不受影响。
public class TheView
{
private ViewModel TheViewModel { get; set; }
public TheView()
{
TheViewModel = new ViewModel();
DataContext = TheViewModel;
}
public Refresh() { TheViewModel = new ViewModel(); }
}
问题是为什么会这样。或者更确切地说,如果它应该如此。我想,如果它不应该像这样表现,也许我在代码中的其他地方有问题,那就是流量......
答案 0 :(得分:2)
我认为您确实需要了解DataContext
是依赖属性。
它的定义如下:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Localizability(LocalizationCategory.NeverLocalize)]
public object DataContext
{
get
{
return this.GetValue(FrameworkElement.DataContextProperty);
}
set
{
this.SetValue(FrameworkElement.DataContextProperty, value);
}
}
...
public static readonly DependencyProperty DataContextProperty =
DependencyProperty.Register("DataContext", typeof (object...
依赖属性不仅仅是普通的.NET属性,因为它们支持
在您的情况下,这是“更改通知”主题,这很重要。
当您(重新)为属性(即DataContext
)分配值时,WPF将自动获取此更改。在这种情况下,更改通知是在依赖属性的setter中完成的,可以这么说。
如果分配给“普通”属性或甚至是私有字段,则不是这种情况(即不调用DataContext
属性的setter),即使它指向DataContext。
答案 1 :(得分:1)
您基本上是在重新分配私有属性,而不是DataContext。
TheViewModel
TheViewModel
TheViewModel
私有财产指向实例B - >没有理由要刷新DataContext。你没碰过它。它仍指向初始实例A,它仍在内存中。
修改强>:
答案是假设绑定使用
通知视图DataContext
作为来源,而不是TheViewModel
。DataContext
是DependencyProperty,而TheViewModel
不是。{1}}。用TheViewModel
替换整个视图模型作为绑定源需要通过依赖属性或NotifyPropertyChanged