2

在 ViewModels 中通常有很多这样的

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

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

这样您只需要编写如下内容:

public Bindable<string> SomeField;

也许有一个应该被解雇的行动NotifyPropertyChanged......

4

2 回答 2

3

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

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

然后 Binding againstSomeField将访问包含的值并设置它会导致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);
    }
}

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


在对我提出的解决方案进行进一步调查时,我发现由于为了记住目标和其他细节而隐式转换 from Tto开始工作会有问题Bindable<T>,我确信这种解决方案包含足够的想法来引导到一个工作的。

于 2013-04-05T12:23:16.090 回答
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 的类,并使用更改通知覆盖每个属性。这种方法的缺点是您需要使用该代理而不是您的类,并且您的所有属性都需要是虚拟的。
于 2013-04-05T12:25:15.427 回答