c# - setter 可以获取它所在的属性的名称吗

标签 c# wpf

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

private int _x;
public int X 
{
get{ return _x;}
set{_x = value; OnPropertyChanged(*theNameOfTheProperty*);}
}

没有实际指定 OnPropertyChanged("X");
我猜想制作 OnPropertyChanged更通用的也许使用反射......

最佳答案

有两种方法可以按照您的要求进行操作。第一种(仅限 .NET 4.5+!)方法是将 OnPropertyChanged 修改为:

private void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
 ....
}

然后你从二传手调用它:
set
{
   _var = value;
   OnPropertyChanged();
}

这将使用调用属性自动填充“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>

关于c# - setter 可以获取它所在的属性的名称吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439683/

相关文章:

c# - 从表中的所有行计算 TotalAmount

C# 等同于 TypeScript 模板文字类型?

javascript - 将复杂的字典发布到 Controller

c# - 何时在自定义控件中使用属性而不是依赖属性?

c# - 如何为附加属性设置动画?

wpf - Windows Presentation Foundation (WPF) 项目不支持应用程序

c# - doxygen 无法解析对同一 C# 命名空间中的成员的 @ref 引用

javascript - 使用 MVC Razor 语法检查 View 模型属性在 Javascript 中是否具有值

c# - 动态数据显示 - WPF - 需要将文本添加到 Canvas - C#

wpf - 如何使 WPF DataGrid 显示具有绑定(bind)和 DataTemplate 的 ViewModel 集合