检查WPF MVVM绑定中已更改的属性

检查WPF MVVM绑定中已更改的属性,mvvm,data-binding,inotifypropertychanged,Mvvm,Data Binding,Inotifypropertychanged,我正在从如下对象绑定属性: 视图模型: public class VieModel { public Model MyModel { get { return myModel; } set { myModel = value; } } private Model myModel } public class Mod

我正在从如下对象绑定属性:

视图模型

public class VieModel
{
    public Model MyModel 
    { 
        get
        {
            return myModel;
        } 
        set
        {
            myModel = value;
        }
    }
    private Model myModel
}
public class Model
{
    public string Name { get; set;}
    public string Info { get; set;}
    public string MoreInfo { get; set;}
}
<TextBox Text="{Binding MyModel.Name, Mode=TwoWay, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.Info, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.MoreInfo, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
型号

public class VieModel
{
    public Model MyModel 
    { 
        get
        {
            return myModel;
        } 
        set
        {
            myModel = value;
        }
    }
    private Model myModel
}
public class Model
{
    public string Name { get; set;}
    public string Info { get; set;}
    public string MoreInfo { get; set;}
}
<TextBox Text="{Binding MyModel.Name, Mode=TwoWay, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.Info, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.MoreInfo, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
查看

public class VieModel
{
    public Model MyModel 
    { 
        get
        {
            return myModel;
        } 
        set
        {
            myModel = value;
        }
    }
    private Model myModel
}
public class Model
{
    public string Name { get; set;}
    public string Info { get; set;}
    public string MoreInfo { get; set;}
}
<TextBox Text="{Binding MyModel.Name, Mode=TwoWay, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.Info, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.MoreInfo, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
二进制格式化程序。序列化

public class VieModel
{
    public Model MyModel 
    { 
        get
        {
            return myModel;
        } 
        set
        {
            myModel = value;
        }
    }
    private Model myModel
}
public class Model
{
    public string Name { get; set;}
    public string Info { get; set;}
    public string MoreInfo { get; set;}
}
<TextBox Text="{Binding MyModel.Name, Mode=TwoWay, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.Info, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
<TextBox Text="{Binding MyModel.MoreInfo, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" />
您需要
模型中使用的每个对象都具有
[Serializable]
属性

[Serializable]
public class Model
{
    public string Name { get; set;}
    public string Info { get; set;}
    public string MoreInfo { get; set;}
    public SecondModel SecondOne { get; set;}

    public static Model Clone(Model obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;
            return (T)formatter.Deserialize(ms);
        }
    }
}

[Serializable]
public class SecondModel 
{
    public string SecondName { get; set;}
    public string SecondInfo { get; set;}
    public string SecondMoreInfo { get; set;}
}

我的方法与最初的评论略有不同。我使用的选项不是实现
IComparer
,而是覆盖
Equals
方法

public class Model
{
    public string Name { get; set; }
    public string Info { get; set; }
    public string MoreInfo { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Model model)
        {
            return string.Equals(this.Name, model.Name, StringComparison.Ordinal);
            // && Add your other property comparisons here...;
        }

        return false;
    }

    public override int GetHashCode()
    {
        // You really should provide your implementation here:
        return base.GetHashCode();
    }
}
然后,一旦像上面那样设置了模型类,就可以在ViewModel类中执行检查:

public class VieModel
{
    private Model myModel;

    public Model MyModel
    {
        get
        {
            return myModel;
        }
        set
        {
            if (myModel?.Equals(value) != true)
            {
                // The model has changed so you can perform what you want here...


                myModel = value;
            }
        }
    }
}

您确切需要何时知道MyModel是否有任何更改?如果要更改
MyModel
的值,您可以在属性设置器中处理它,并提供
IComparer
的实现,以检查是否有任何更改。您必须实现
INotifyPropertyChanged
接口。如图所示@k1ll3r8e-正如我所说,绑定工作正常@比金顿——这就是我需要的。永远不要和我的同事一起工作。我来看看。或者你能举个简单的例子吗?太好了!:)@bene_rawr我添加了一个基本的例子,虽然现在没有使用IComparer。好吧,这有点奏效。谢谢我不得不做一些其他的事情来完成我的场景,但现在它像一个魅力。