【问题标题】:c# class written in simple terms for wpf mvvmc#为wpf mvvm写的简单的类
【发布时间】:2015-10-20 11:28:52
【问题描述】:

我在网上看到了一个示例教程,并看到了一个为 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;
    }
}

【问题讨论】:

  • 您的实际问题是什么?
  • 我对教程课的翻译正确吗?
  • 能发一下教程链接吗?

标签: c# wpf mvvm


【解决方案1】:

我们必须查看 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);
    }

【讨论】:

    【解决方案2】:

    简短回答:不,它不是在做同样的事情。

    教程类描述了应该有两个像这样的附加方法:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多