为什么MVVM Light中没有PropertyChanged的简写

时间:2010-12-29 22:15:40

标签: .net mvvm mvvm-light

每当我们在setter中调用PropertyChanged时MVVM Light中没有简写,就像在flex [Bindable]中一样:

[PropertyChanged]
public bool IsEditable { .... }

为什么我们每次都要写PropertyChanged(“IsEditable”),它容易出错,哪些可以默认。

4 个答案:

答案 0 :(得分:7)

我决定不把它添加到MVVM Light中,因为解决方案涉及反射(减慢性能)或IL编织(这是“魔术”,因此违背了MVVM Light的原则,这将是轻量级的简单易懂。

为了“反对”你提到的问题,我在MVVM Light中有三个工具:

  • 自动创建“可绑定”属性的代码段。只需键入mvvminpc,然后展开代码段即可。这是避免编写代码的简单方法。
  • “魔术字符串”在VM类上声明为公共const字符串。这样就可以避免拼写错误。
  • 在调试时,ViewModelBase类会在调用RaisePropertyChange时自动检查VM类上是否存在属性名称。这会在开发游戏的早期发现拼写错误。

使用这三个工具,我的评价是不需要其他机制。但是,根据大众需求,我将使用lambda表达式(例如RaisePropertyChanged(vm => vm.MyProperty))为RaisePropertyChanged添加一种方法。当然,如果您不希望获得这意味着的性能,那么这将是可选的。

此外,我今年一直在与有影响力的人士(包括Anders Heljsberg)进行讨论,并强调在框架中(或甚至在语言中)将这一点融入其中会很好。这将是最令人满意的解决方案(因为MSFT可以对此进行优化),但这显然需要时间(如果它曾经发生过)。

干杯, 劳伦

答案 1 :(得分:5)

您可以创建strongly typed INotifyPropertyChanged行为。这将允许你做一些像......

RaiseChanged(() => this.PropertyName);

答案 2 :(得分:2)

如果不重写IL以插入PropertyChanged调用,则无法执行此操作。 (或者使用极慢的代理,并在运行时构建继承的类型)

您正在寻找PostSharp

您还可以创建一个引发事件的代码段:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Property With Change Event</Title>
            <Shortcut>propc</Shortcut>
            <Description>Code snippet for property that calls OnPropertyChanged and XML description</Description>
            <Author>SLaks</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>type</ID>
                    <ToolTip>Property type</ToolTip>
                    <Default>string</Default>
                </Literal>
                <Literal>
                    <ID>property</ID>
                    <ToolTip>Property name</ToolTip>
                    <Default>MyProperty</Default>
                </Literal>
                <Literal>
                    <ID>field</ID>
                    <ToolTip>Backing field name</ToolTip>
                    <Default>myProperty</Default>
                </Literal>
                <Literal>
                    <ID>desc</ID>
                    <ToolTip>The description of this property</ToolTip>
                    <Default>...</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[$type$ $field$;
            ///<summary>Gets or sets $desc$.</summary>
            public $type$ $property$ {
                get { return $field$; }
                set { $field$ = value; OnPropertyChanged("$property$"); }
            }
            $end$]]></Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

答案 3 :(得分:0)

无论好坏,都不可能以您建议的方式使用编译时属性实现自动属性更改通知。但是,在MVVM Light中,当在调试版本中运行时,将验证您的PropertyChanged调用以确保它们对应于实际属性,这意味着重构属性名称而不更改字符串捕获在调试版本中。