WPF MVVM绑定嵌套属性

时间:2016-08-15 13:41:38

标签: c# wpf mvvm binding

我正在创建一个应用程序,用户可以在其中编辑孩子的主数据,并且我尝试通过保存他们对孩子所做的更改来为用户创建无缝体验它们。

我有一个名为Child的模型。

class Child
{
    [Key]
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

我有一个视图(ChildMasterDataView),它在可编辑的文本框中显示FirstName和Surname。

<!--First name-->
<Label Content="First name:" />
<TextBox Text="{Binding Path=Child.FirstName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

<!--Surname-->
<Label Content="Surname:" />
<TextBox Text="{Binding Path=Child.Surname, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

我有一个处理INotifyPropertyChanged接口实现的类。

public class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChangedEvent(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

我有一个ViewModel,当相应的属性发生变化时,它应该保存对Firstname和Surname所做的更改。问题是Firstname和Surname是Child类的嵌套属性,并且没有触发PropertyChanged事件......

class ChildMasterDataViewModel : ObservableObject
{
    private Database db; // Database context

    public ChildViewModel()
    {
        db = new Database();
        Child = db.Children.ToList().Where(e => e.PlbNr == 1).FirstOrDefault(); // Won't be null because child has been chosen earlier

        PropertyChanged += ChildPropertyChanged;
    }

    private Child child;
    public Child Child
    {
        get { return child; }
        set { child = value; RaisePropertyChangedEvent("Child"); }
    }

    private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        db.SaveChanges();
    }
}

通过对ViewModel进行以下更改(以及更改视图绑定),我可以完成我想要的任务:

class ChildMasterDataViewModel : ObservableObject
{
    private Database db; // Database context
    private Child child;

    public ChildViewModel()
    {
        db = new Database();
        child = db.Children.ToList().Where(e => e.PlbNr == 1).FirstOrDefault(); // Won't be null because child has been chosen earlier

        PropertyChanged += ChildPropertyChanged;
    }

    public string FirstName
    {
        get { return child.FirstName; }
        set { child.FirstName= value; RaisePropertyChangedEvent("FirstName"); }
    }

    public string Surname
    {
        get { return child.Surname; }
        set { child.Surname= value; RaisePropertyChangedEvent("Surname"); }
    }

    private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        db.SaveChanges();
    }
}

但这不是正确的,必须有更好的方法吗?

我尝试在Child类中实现ObservableObject,然后在ViewModel中将Child类的PropertyChanged事件订阅到ViewModel的ChildPropertyChanged方法。这没用。

1 个答案:

答案 0 :(得分:0)

当依赖属性开始使用绑定时,它会尝试将绑定实例转换为INotifyPropertyChanged,之后使用&#34;弱事件&#34;订阅活动。所以dependecy属性对内部属性等一无所知,它只是尝试转换为INotifyPropertyChanged并对事件进行处理。接下来,当事件将会上升时,依赖性peroperty,使用反射,将获得新的价值(它改善它的方式,你可以编写自己的依赖属性,这将使用表达式,从中获取价值属性)