我正在尝试实现一个MVVM UserControl,用于编辑有关单个类实例的信息(例如Person类的实例)。我创建了一个View,一个ViewModel和一个Model。当我的应用程序启动View时,View会自动在其DataContext中实例化ViewModel。 ViewModel使用Model类的新实例进行实例化。
现在,当我为ViewModel.Source属性分配不同的Person时,属性不会在View中更新(因为DataContext没有改变,我没有提出PropertyChanged事件。当然我可以在所有属性上引发属性更改事件分配一个新的Person实例时ViewModel类是什么。但这是否合适?没有更好的方法吗?我是否必须为每个Person实例创建一个新的ViewModel然后将它分配给View.DataContext?
这就是3个类看起来像:
<UserControl x:Class="PersonView" xmlns:vm="clr-namespace:MyNamespace">
<UserControl.Resources>
<vm:PersonViewModel x:Key="viewmodel" />
</UserControl.Resources>
<Grid>
<TextBox x:Name="txLastName" Grid.Row="1" Grid.Column="1" Text="{Binding Path=txLastName}" />
</Grid>
</UserControl>
代码:
public class PersonViewModel : INotifyPropertyChanged
{
private Person _source;
public Person Source
{
get
{
if (_source == null) _source = new Person();
return _source;
}
set
{
_source = value;
//should I now raise property changed on each property?
}
}
public String txLastName
{
get { return Source.LastName; }
set
{
Source.LastName = value;
this.RaisePropertyChanged("txLastName");
}
}
}
public class Person
{
public String LastName { get; set; }
}
答案 0 :(得分:1)
如果以这种方式构造绑定,则是,当您更改Source
时,您需要针对依赖于它的任何属性提出属性更改通知。请注意RaisePropertyChanged(string.Empty)
通常被解释为&#39;所有属性已更改的潜在快捷方式&#39;。
如果ViewModel中没有属性组合(即所有都是示例中的简单委托),并且模型的属性不会更改(或者,如果它们可以更改,则模型实现INotifyPropertyChanged
)那么直接绑定到模型可能更简单(例如{Binding Path=Source.LastName}
)。这样,当Source
更改依赖于Source
的所有绑定都将更新时。