在ViewModels中通常有很多这些
private string someField;
public string SomeField
{
get
{
return someField;
}
set
{
someField = value;
NotifyOfPropertyChanged(() => SomeField);
}
}
有没有办法获得这样一个构造的简短版本,甚至是Bindable
?
所以你只需写下类似的内容:
public Bindable<string> SomeField;
可能会针对NotifyPropertyChanged
...
答案 0 :(得分:3)
我想您可以创建自己的类来维护一个值,并针对您可以创建的包含类引发INotifyPropertyChanged
:
public Bindable<string> SomeField = new Bindable<string>("test", this);
然后对SomeField
进行绑定会访问所包含的值并设置它会导致INotifyPropertyChanged
被this
您需要使用一些隐式强制转换运算符,以便让绑定系统将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>
的隐式演员,为了记住目标和其他细节,开始工作会有问题,我确信这种解决方案包含足够的想法可以导致工作。
答案 1 :(得分:0)
存在自动属性,可以用作没有逻辑的属性的快捷方式。
以下两个属性是等效的:
private string someField;
public string SomeField
{
get { return someField; }
set { someField = value; }
}
public string SomeField { get; set; }
但是,没有内置方法可以将更改通知引入此中。
但是,如果您想投入时间和/或金钱,有办法让自动属性通知变更: