ViewModel中的可绑定字段
本文关键字:绑定 字段 ViewModel | 更新日期: 2023-09-27 18:07:29
在ViewModels中,通常有很多这样的
private string someField;
public string SomeField
{
get
{
return someField;
}
set
{
someField = value;
NotifyOfPropertyChanged(() => SomeField);
}
}
有没有办法得到这样一个结构的短版本,甚至是Bindable
?
这样你只需要写一些类似的东西:
public Bindable<string> SomeField;
也许是为了NotifyPropertyChanged
。。。
我想您可以创建自己的类,该类维护一个值,并针对您可以创建的包含类引发INotifyPropertyChanged
,例如:
public Bindable<string> SomeField = new Bindable<string>("test", this);
然后,针对SomeField
的绑定将访问包含的值,并且设置该值将导致针对this
引发INotifyPropertyChanged
您需要使用一些隐式强制转换运算符,以便使绑定系统将您的Bindable<T>
视为T
的源和放置T
的位置
请参阅:http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
以下内容可能就足够了:
public class Bindable<T>
{
private T _value;
private PropertyChangedEventHandler _notifyHandler;
private INotifyPropertyChanged _notifyTarget;
private string _name;
public Bindable(PropertyChangedEventHandler notifyHandler, INotifyPropertyChanged notifyTarget, string name, T value = default(T), bool trigger = false)
{
_value = value;
_name = name;
_notifyHandler = notifyHandler;
_notifyTarget = notifyTarget;
if (trigger)
{
_notifyHandler(_notifyTarget, new PropertyChangedEventArgs(_name));
}
}
public implicit operator T(Bindable<T> bindable)
{
return bindable._value;
}
public implicit operator Bindable<T>(T value)
{
return new Bindable<T>(_notifyHandler, _notifyTarget, _name, value, true);
}
}
上面的代码很粗糙,毫无疑问可以创建一个更好的版本,但它应该为您指明需要的方向。
在对我提出的解决方案进行进一步调查时,我发现,由于从T
到Bindable<T>
的隐式转换,为了记住目标和其他细节,开始工作是有问题的,我相信这种解决方案包含足够的想法,可以产生一个有效的解决方案。
存在自动属性,可以用作无逻辑属性的快捷方式。
以下两个属性是等效的:
private string someField;
public string SomeField
{
get { return someField; }
set { someField = value; }
}
public string SomeField { get; set; }
但是,没有内置的方法将更改通知引入其中。
但如果你想投入时间和/或金钱,有一些方法可以让汽车房地产通知你变化:
- 使用像PostSharp这样的AOP框架。它将在编译后的步骤中注入此功能:http://www.postsharp.net/model/inotifypropertychanged.这种方法的缺点是PostSharp不是免费的
- 使用动态创建的代理类。在运行时,您可以创建一个从实际ViewModel派生的类,并使用更改通知覆盖每个属性。这种方法的缺点是,您需要使用该代理而不是您的类,并且您的所有属性都需要是虚拟的