将模型的另一个实例分配给ViewModel

时间:2014-11-30 20:28:22

标签: c# xaml mvvm

我正在尝试实现一个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; }
}

1 个答案:

答案 0 :(得分:1)

如果以这种方式构造绑定,则是,当您更改Source时,您需要针对依赖于它的任何属性提出属性更改通知。请注意RaisePropertyChanged(string.Empty)通常被解释为&#39;所有属性已更改的潜在快捷方式&#39;。

如果ViewModel中没有属性组合(即所有都是示例中的简单委托),并且模型的属性不会更改(或者,如果它们可以更改,则模型实现INotifyPropertyChanged)那么直接绑定到模型可能更简单(例如{Binding Path=Source.LastName})。这样,当Source更改依赖于Source的所有绑定都将更新时。