Почему для PropertyChanged в MVVM Light нет сокращения - PullRequest
0 голосов
/ 30 декабря 2010

Там, где в MVVM Light нет сокращения, каждый раз, когда мы вызываем PropertyChanged в установщике, что-то вроде в flex [Bindable]:

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

почему мы должны каждый раз записывать PropertyChanged ("IsEditable"), его подвержены ошибкам, где его можно использовать по умолчанию.

Ответы [ 4 ]

7 голосов
/ 30 декабря 2010

Я решил не добавлять это в MVVM Light, потому что решения включают в себя либо Reflection (который замедляет работу), либо IL-ткачество (что является «волшебным») и поэтому противоречит принципам MVVM Light, который должен быть легким ипрост для понимания.

Чтобы «бороться» с упомянутыми вами проблемами, в MVVM Light есть три инструмента:

  • Фрагмент кода для автоматического создания «связываемого» свойства. Просто введитеmvvminpc, а затем разверните фрагмент. Это простой способ избежать написания кода.
  • «Волшебная строка» объявляется как открытая константная строка в классе VM. Таким образом, вы избегаете опечаток.
  • Во время отладки класс ViewModelBase автоматически проверяет, существует ли имя свойства в классе VM при вызове RaisePropertyChange. Это ловит опечатки в начале разработки.

С этими тремя инструментами онмоя оценка того, что другие механизмы не нужны. Однако, по многочисленным просьбам, я добавлю способ в RaisePropertyChanged с использованием лямбда-выражения (например, RaisePropertyChanged (vm => vm.MyProperty)).Это будет, конечно, необязательно, если вы не хотите, чтобы этот хит был идеальным.

Кроме того, в этом году я разговаривал с влиятельными людьми (включая Андерса Хелсберга) и подчеркнул, что это будетбыло бы хорошо, чтобы это было запечено в рамках (или даже на языке).Это было бы самым удовлетворительным решением (из-за улучшения производительности, которое MSFT могла бы сделать для этого), но это, очевидно, потребует времени (если это когда-нибудь произойдет).

Cheers, Laurent

5 голосов
/ 30 декабря 2010

Вы можете создать строго типизированное поведение INotifyPropertyChanged . Что позволит вам сделать что-то вроде ...

RaiseChanged(() => this.PropertyName);
2 голосов
/ 30 декабря 2010

Это невозможно сделать без перезаписи 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>
0 голосов
/ 30 декабря 2010

К лучшему или к худшему, невозможно реализовать автоматические уведомления об изменении свойств, используя атрибуты времени компиляции, как вы предлагаете. Однако в MVVM Light при запуске в сборке отладки ваши вызовы PropertyChanged будут проверены, чтобы убедиться, что они соответствуют реальным свойствам, что означает, что рефакторинг имени свойства без изменения строки приведет к отлову в отладке строить.

...