c#类用简单的术语写成wpf mvvm

时间:2015-10-20 11:28:52

标签: c# wpf mvvm

我在线看到了一个示例教程,并为wpf项目看到了类似这样的类的属性。我想知道这会用更简单的术语转化为什么,因为我以前从未见过这样写过的课程。

我尝试的翻译是否正确?意思是它正在做教程类正在做的事情吗?

教程类

public ObservableCollection<string> Directories
{
    get { return Get<ObservableCollection<string>>(); }
    set { Set(value); }
}

我试图猜测它会被写成什么

private ObservableCollection<string> _directories; 
public ObservableCollection<string> Directories
{
    get
    {
        return this._directories;
    }

    set
    {
        this._directories= value;
    }
}

2 个答案:

答案 0 :(得分:3)

我们必须看到Get / Set实现才能正确回答这个问题但我的猜测是为了提高代码的可读性。在MVVM属性中经常会看到两件事:getter中的自动初始化和setter中的属性更改通知......

    private ObservableCollection<string> _directories;
    public ObservableCollection<string> Directories
    {
        get
        {
            // auto-initialize
            if (this._directories == null)
                this._directories = new ObservableCollection<string>();
            return this._directories;
        }
        set
        {
            this._directories = value;
            RaisePropertyChanged("Directories"); // INPC
        }
    }

如果您为大量属性执行此操作,则会导致大量代码膨胀。我的猜测是你的教程类中的Set和Get方法可能被用来自动实现这些功能,或至少类似的东西。以下代码将为您发布的属性提供该功能:

    private Dictionary<string, object> Properties = new Dictionary<string, object>();

    public T Get<T>([CallerMemberName] string propertyName = null)
    {
        if (!Properties.ContainsKey(propertyName))
            Properties[propertyName] = default(T);
        return (T)Properties[propertyName];
    }

    public void Set<T>(T value, [CallerMemberName] string propertyName = null)
    {
        Properties[propertyName] = value;
        RaisePropertyChanged(propertyName);
    }

答案 1 :(得分:2)

简短的回答:不,它没有做同样的事情。

教程类描述了应该有两个额外的方法:

 private void Set(ObservableCollection<string> value)
 {
       //  do something
 }

 private T Get<T>()
 {
       //  do something
 }

以下示例是您尝试猜测的自动属性版本:

public ObservableCollection<string> Directories
{
      get; set;
}

也许这就是教程试图展示的内容?