代码之家  ›  专栏  ›  技术社区  ›  vidalsasoon

mvvm-raisepropertychanged将代码变成一团混乱

  •  9
  • vidalsasoon  · 技术社区  · 15 年前

    新来的MVVM,请原谅我的无知。

    我想我用得对,但是我发现我的viewmodel有太多这样的东西:

    RaisePropertyChanged("SomeProperty")
    

    每次我设置了一个财产,我必须提出的该死的财产改变。

    我怀念那些我可以去的日子:

    public int SomeInteger { get; private set;}
    

    这些天我不得不把“raisePropertyChanged”贴在任何地方,否则我的用户界面不会反映这些变化:(

    是我做错了,还是其他人对过多的魔术弦和老派的财产设定者感到恼火?

    我应该改用依赖项属性吗?(我怀疑这会有助于代码膨胀)

    尽管有这些问题,我仍然认为mvvm是一条路,所以我想这是一件事。

    5 回复  |  直到 15 年前
        1
  •  12
  •   Community CDub    8 年前

    看看这个 What is the best or most interesting use of Extension Methods you've seen? .

    它描述了一个扩展方法和一个helper方法,我的模型类和viewmodel类使用该方法来启用以下强类型(没有魔术字符串)属性。

    private string _name;
    public string Name
    {
        get { return _name; }
        set { this.NotifySetProperty(ref _name, value, () => this.Name); }
    }
    

    这是我认为最简单的。希望有帮助。

        2
  •  8
  •   PL.    15 年前

    您可以使用postsharp的notifyPropertyChanged属性。然后你所要做的就是在类上加上一个属性,就这样。例如。:

    [NotifyPropertyChanged]
    public class MyClass 
    {
        public string MyProperty { get; set; }
    }
    
        3
  •  4
  •   ima    15 年前

    它有助于从不同的角度看问题:这些不是复杂的.NET属性,而是简化的依赖项属性。

    wpf中视图模型的可绑定属性与.net属性不同,而是一种键值存储。如果你想用轻量级替代dependencyobject,你有能力实现这个键值存储,只需在setters中调用某个函数——实际上还不错。当然,这也远不是理想,但你的观点肯定是不公平的。

        4
  •  0
  •   Steven Wilber    14 年前

    它不会让您返回到干净的代码,但我使用一个简单的扩展方法来获取属性名,以避免出现幻数字符串的问题。它还保持代码的可读性,也就是说,它清楚地显示了正在发生的事情。

    扩展方法如下:

    public static string GetPropertyName(this MethodBase methodBase)
    {
        return methodBase.Name.Substring(4);
    }
    

    这意味着您的属性集对名称更改具有弹性,如下所示:

    private string _name;
    public string Name
    {
        get { return _name; }
        set 
        {
                name = value;
                RaisePropertyChanged(MethodBase.GetCurrentMethod().GetPropertyName()); 
        }
    }
    

    我写了更多关于这个的东西 extension method here 我已经 published a matching code snippet here .

        5
  •  0
  •   Reader Man San    11 年前

    这将有助于: “有点神奇” 不费吹灰之力就改变了特性

    [http://visualstudiogarley.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a][1]

    作为将其添加到一个属性的示例:

    [Magic] 
    public string Name { get { return _name; } set { _name = value; } } 
    string _name;
    

    将其添加到所有类属性的另一个示例:

    [Magic] 
    public class MyViewModel: INotifyPropertyChanged 
    { 
      public string Name { get; set; } 
      public string LastName { get; set; } 
      ..... 
    }