我有一个类,我绑定到我的视图模型。它基本上是一个充满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的等价物?
答案 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));
}
}