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。。。

ViewModel中的可绑定字段

我想您可以创建自己的类,该类维护一个值,并针对您可以创建的包含类引发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);
    }
}

上面的代码很粗糙,毫无疑问可以创建一个更好的版本,但它应该为您指明需要的方向。


在对我提出的解决方案进行进一步调查时,我发现,由于从TBindable<T>的隐式转换,为了记住目标和其他细节,开始工作是有问题的,我相信这种解决方案包含足够的想法,可以产生一个有效的解决方案。

存在自动属性,可以用作无逻辑属性的快捷方式。

以下两个属性是等效的:

private string someField;
public string SomeField
{
    get { return someField; }
    set { someField = value; }
}
public string SomeField { get; set; }

但是,没有内置的方法将更改通知引入其中。

但如果你想投入时间和/或金钱,有一些方法可以让汽车房地产通知你变化:

  1. 使用像PostSharp这样的AOP框架。它将在编译后的步骤中注入此功能:http://www.postsharp.net/model/inotifypropertychanged.这种方法的缺点是PostSharp不是免费的
  2. 使用动态创建的代理类。在运行时,您可以创建一个从实际ViewModel派生的类,并使用更改通知覆盖每个属性。这种方法的缺点是,您需要使用该代理而不是您的类,并且您的所有属性都需要是虚拟的