ViewModel中的可绑定字段

时间:2013-04-05 12:18:53

标签: c# wpf binding properties

在ViewModels中通常有很多这些

private string someField;
public string SomeField
{
    get 
    {
        return someField;   
    }
    set
    {
        someField = value;
        NotifyOfPropertyChanged(() => SomeField);
    }
}

有没有办法获得这样一个构造的简短版本,甚至是Bindable

所以你只需写下类似的内容:

public Bindable<string> SomeField;

可能会针对NotifyPropertyChanged ...

触发一个动作

2 个答案:

答案 0 :(得分:3)

我想您可以创建自己的类来维护一个值,并针对您可以创建的包含类引发INotifyPropertyChanged

public Bindable<string> SomeField = new Bindable<string>("test", this);

然后对SomeField进行绑定会访问所包含的值并设置它会导致INotifyPropertyChangedthis

提出

您需要使用一些隐式强制转换运算符,以便让绑定系统将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>的隐式演员,为了记住目标和其他细节,开始工作会有问题,我确信这种解决方案包含足够的想法可以导致工作。

答案 1 :(得分:0)

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

以下两个属性是等效的:

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的类,并使用更改通知覆盖每个属性。这种方法的缺点是您需要使用该代理而不是您的类,并且您的所有属性都需要是虚拟的。