Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight MVVM-RaisePropertyChanged将代码变成一团乱麻_Silverlight_Silverlight 3.0_Mvvm - Fatal编程技术网

Silverlight MVVM-RaisePropertyChanged将代码变成一团乱麻

Silverlight MVVM-RaisePropertyChanged将代码变成一团乱麻,silverlight,silverlight-3.0,mvvm,Silverlight,Silverlight 3.0,Mvvm,MVVM新手,请原谅我的无知 我认为我使用它是正确的,但我发现我的ViewModel有太多这样的功能: RaisePropertyChanged("SomeProperty") 每次我设置一个属性,我都必须提高那该死的属性改变 我怀念那些我可以去的日子: public int SomeInteger { get; private set;} 这些天,我不得不在任何地方粘贴“RaisePropertyChanged”,否则我的UI无法反映这些更改:( 是我做错了,还是其他人对过多的魔法字符串和

MVVM新手,请原谅我的无知

我认为我使用它是正确的,但我发现我的ViewModel有太多这样的功能:

RaisePropertyChanged("SomeProperty")
每次我设置一个属性,我都必须提高那该死的属性改变


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

public int SomeInteger { get; private set;}
这些天,我不得不在任何地方粘贴“RaisePropertyChanged”,否则我的UI无法反映这些更改:(

是我做错了,还是其他人对过多的魔法字符串和老式的财产设定器感到恼火

我应该改为使用依赖属性吗?(我怀疑这会帮助代码膨胀)

尽管存在这些问题,我仍然认为MVVM是一条发展之路,所以我想这是一条路。

看看这个

它描述了我的模型和ViewModel类用于启用以下强类型(无魔术字符串)属性的扩展方法和帮助器方法

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

这是我认为它能做到的最简单的。希望它能有所帮助。

从不同的角度看问题会有所帮助:这些不是复杂的.NET属性,而是简化的依赖属性


WPF中视图模型的可绑定属性与.NET属性不同,相反,它是一种键值存储。如果您想用轻量级的替代品替代DependencyObject,您可以实现这个键值存储,只需在setters中调用某些函数即可-实际上不错。当然,这也不理想,但您的观点是当然,这种观点是不公平的。

您可以使用PostSharp的NotifyPropertyChanged属性。然后您只需在类上添加一个属性即可。例如:

[NotifyPropertyChanged]
public class MyClass 
{
    public string MyProperty { get; set; }
}

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

扩展方法如下所示:

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()); 
    }
}
我已经写了更多关于这方面的文章,我已经写了。

这将有助于: “一种魔力” 不费吹灰之力改变了性能

[http://visualstudiogallery.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; } 
  ..... 
}

谢谢。有点高兴知道我不是唯一一个有问题的人。“我怀念我可以去的日子”我们多么容易忘记,在《C#2》中你根本不能那样做。)是的,我想我被宠坏了,但尽管取得了进展,我仍然认为可以有一个更干净的方法来实现这些东西。不过,我对内部工作/折衷的了解还不够……没有运行时开销,因为PostSharp只需修改编译后的类并注入与手动编写完全相同的代码。构建时开销很小,但我发现可以忽略不计。这种方法的唯一缺点是,有时需要为调用setter的属性以外的属性提高PropertyChanged。免责声明:PostSharp是商业软件和初学者(免费)版本不支持此属性。请使用高级和免费选项:Stepen Cleary的计算属性。我在生产中使用了这两种方法,它比PostSharp的方面灵活得多。所有postsharp限制均不适用于计算特性。它可以连接从循环、虚拟方法、LINQ到对象的依赖关系,基本上,任何疯狂的运行时依赖关系都是可以想象的,无论多么间接,依赖关系图在运行时会自动重新布线,并且只是毫无仪式地工作。它们也很快。样板代码也是最小的。我知道,这个老问题:)另一种方法是将RaisePropertyChanged封装在基类中,并使用以下方法签名:OnRaisePropertyChanged([CallerMemberName]propertyName=”“)。这样,您就可以调用该方法,而无需写入属性名