检查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。好吧,这有点奏效。谢谢我不得不做一些其他的事情来完成我的场景,但现在它像一个魅力。