setter可以获取它所在属性的名称

jha*_*100 1 c# wpf

我只是想知道是否可以做这样的事情:

private int _x;
public int X 
{
get{ return _x;}
set{_x = value; OnPropertyChanged(*theNameOfTheProperty*);}
}
Run Code Online (Sandbox Code Playgroud)

没有实际指定 OnPropertyChanged("X");

我想OnPropertyChanged使用反射制作更通用的...

Bra*_*NET 5

有两种方法可以做你要问事情.第一个(仅限.NET 4.5+!)方法是将OnPropertyChanged修改为:

private void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
 ....
}
Run Code Online (Sandbox Code Playgroud)

然后你从setter中调用它:

set
{
   _var = value;
   OnPropertyChanged();
}
Run Code Online (Sandbox Code Playgroud)

除非您明确提供参数,否则这将使用调用属性自动填充"propertyName"参数.请注意,您需要using System.Runtime.CompilerServices;获取CallerMemberName属性的命名空间.

另一种方法是编写自定义版本的propfull代码段,以便在创建时为您填充.我的这个代码段的版本是:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>propnp</Title>
            <Shortcut>propnp</Shortcut>
            <Description>Code snippet for property with OnPropertyChanged</Description>
            <Author>Bradley</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>type</ID>
                    <ToolTip>Property type</ToolTip>
                    <Default>int</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>myVar</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[public $type$ $property$
    {
        get { return $field$;}
        set 
        { 
            $field$ = value;
            OnPropertyChanged($property$);
        }
    }
    $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
Run Code Online (Sandbox Code Playgroud)