Быстро выставить свойства класса как связываемые - PullRequest
2 голосов
/ 04 января 2012

У меня есть класс, который я привязываю к своей модели представления. Это в основном структура, полная отображаемых строк для пользовательского интерфейса:

class DisplayVO
{
    public string Title { get; set; }
    public string Description { get; set; }
    // ... about a dozen more properties 
}

В основном DisplayVO оборачивает кучу свойств, которые связаны с пользовательским интерфейсом. Это работает до тех пор, пока одна часть пользовательского интерфейса не изменит свойство (например, пользователь может редактировать Description), поэтому я хочу обновить пользовательский интерфейс новыми модификациями.

Так что я обычно делал бы, реализуя интерфейс INotifyPropertyChanged и переопределяя каждый метод set для широковещательной передачи PropertyChanged(this, new PropertyChangedEventArgs(info));

Мне лень - есть ли способ сделать это для всех членов класса? Во Flex я мог сделать:

[Bindable]
public class DisplayVO
{
    private var Title:String;
    private var Description:String;
}

и магическим образом все свойства DisplayVO будут обернуты для автоматической трансляции изменений, и мне не придется писать весь шаблон. Есть ли эквивалент для C # и WPF?

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Вы должны проверить NotifyPropertyWeaver http://github.com/SimonCropp/NotifyPropertyWeaver он запускает задачу пост-сборки, которая делает именно то, что вы после.

1 голос
/ 04 января 2012

Я использую фрагмент объявления свойства, который вызывает OnPropertyChanged. Он также заполняет некоторые атрибуты из пространства имен System.ComponentModel ...

 Description: a brief phrase about what the property does
 DisplayName: how the property should be labelled 
 DefaultValue: the initial value of the property

Этот фрагмент также использует атрибут DebuggerStepThroughAttribute, чтобы отладчик не входил в метод получения и установки, но его следует удалить, если вы не хотите, чтобы этот эффект ...

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Full property declaration</Title>
            <Shortcut>propfull</Shortcut>
            <Description>Code snippet for property and backing field</Description>
            <Author>GJV</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>The variable backing this property</ToolTip>
                    <Default>myProperty</Default>
                </Literal>
                <Literal>
                    <ID>desc</ID>
                    <ToolTip>What the property is about</ToolTip>
                    <Default>My description...</Default>
                </Literal>
                <Literal>
                    <ID>dispname</ID>
                    <ToolTip>Column header</ToolTip>
                    <Default>DisplayName</Default>
                </Literal>
                <Literal>
                    <ID>defaultvalue</ID>
                    <ToolTip>Default value</ToolTip>
                    <Default>""</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp">
        <![CDATA[private $type$ $field$;
    [Description("$desc$"), DisplayName("$dispname$"), DefaultValue($defaultvalue$)]
    public $type$ $property$
    {
            [DebuggerStepThrough]get{return $field$;}
            [DebuggerStepThrough]set
            {
                if(value!=$field$)
                {
                    $field$ = value;
                    OnPropertyChanged("$property$");
                }
            }
    }
    $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Атрибут Description предназначен для извлечения и использования для текста всплывающей подсказки, но он также может обеспечить некоторую ценность документации.

В этом фрагменте предполагается, что в классе модели базового представления есть такой метод ...

protected void OnPropertyChanged(string propertyName)
{
    if(PropertyChanged!=null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
1 голос
/ 04 января 2012

Вы могли бы написать фрагмент, который заполняет шаблон. Вот тот, который я использую (у меня есть метод OnPropertyChanged (), который передает событие:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <Header>
    <Title>ObservableProperty</Title>
    <Author>Scott Austen</Author>
    <Shortcut>#ObsProp</Shortcut>
    <Description>Inserts property definition with private backing field, calling RaisePropertyChanged</Description>
    <SnippetTypes>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>Type</ID>
        <Default>Type</Default>
      </Literal>
      <Literal>
        <ID>PropertyName</ID>
        <Default>P</Default>
      </Literal>
    </Declarations>
    <Code Language="CSharp">
      <![CDATA[public $Type$ $PropertyName$
      {
        get { return _$PropertyName$; }
        set
        {
          _$PropertyName$ = value;          
          OnPropertyChanged("$PropertyName$");
        }
      }

      private $Type$ _$PropertyName$;]]>
    </Code>
  </Snippet>
</CodeSnippet>

, тогда все, что вам нужно сделать, это набрать obsprop TAB TAB {type} TAB TAB {propertyName} ENTER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...