快速将类属性公开为可绑定

时间:2012-01-03 23:00:30

标签: c# wpf mvvm

我有一个类,我绑定到我的视图模型。它基本上是一个充满UI可显示字符串的结构:

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

基本上DisplayVO包含了绑定到UI的一堆属性。这有效,直到UI的一部分修改属性(例如,用户可以编辑Description),因此我想用新修改更新UI。

所以我通常会做的是实现INotifyPropertyChanged界面并覆盖每个set方法来广播PropertyChanged(this, new PropertyChangedEventArgs(info));

我感觉很懒 - 有没有办法让班上所有成员都这样做?在Flex中我可以做到:

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

并且神奇地将DisplayVO的所有属性包装起来以自动广播更改,而无需编写所有样板文件。是否有C#和WPF的等价物?

3 个答案:

答案 0 :(得分:2)

你应该看看NotifyPropertyWeaver http://github.com/SimonCropp/NotifyPropertyWeaver它运行一个后期构建任务,它完全符合你的目标。

答案 1 :(得分:1)

你可以写一个填写样板的片段。这是我使用的一个(我有一个方法,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.

答案 2 :(得分:1)

我使用一个名为OnPropertyChanged的Property Declaration代码段。它还从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,以便调试器不会进入getter和setter,但是如果你不想要这种效果,就应该删除它......

<?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>

描述属性旨在提取并用于ToolTip文本,但它也可以提供一些文档值。

此代码段假定您的基本视图模型类有一个这样的方法......

protected void OnPropertyChanged(string propertyName)
{
    if(PropertyChanged!=null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}