【问题标题】:Can a setter get the name of the property it's insetter 可以获取它所在的属性的名称吗
【发布时间】:2014-08-17 20:19:51
【问题描述】:

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

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

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

我猜想可能使用反射让OnPropertyChanged 更通用...

【问题讨论】:

  • 您可以使用Expressions 来完成。例如在Prism中使用,所以你写OnPropertyChanged(() => MyProperty);
  • check out this question。这就是你要找的吗?
  • 如果你使用的是c# 5.0,那么CallerMemberName 属性在这里真的很方便。
  • 使用 Prism 和 BindableBase,您只需使用 set { SetProperty(ref myProperty, value); } 顺便说一句。这真的简单。

标签: c# wpf


【解决方案1】:

有两种方法按照你的要求去做。第一种(仅限 .NET 4.5+!)方法是将 OnPropertyChanged 修改为:

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

然后你从 setter 调用它:

set
{
   _var = value;
   OnPropertyChanged();
}

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

另一种方法是编写propfull sn-p 的自定义版本,以便在创建时为您填充它。我的这个 sn-p 版本是:

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

【讨论】:

  • 糟透了,也许我应该指定我们使用 .NET 4 和 VS 2010...我将如何编写 propfull 的自定义版本
  • @jharr100,在我的答案中添加了propnp(我的自定义 sn-p 来执行此操作)。
【解决方案2】:

你可以这样声明你的OnPropertyChanged:

    protected void OnPropertyChanged([CallerMemberName] string name = "")
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

然后你可以像这样从属性中调用它:

    public IEnumerable<Customer> Customers
    {
        get
        {
            return this.customers;
        }
        set
        {
            this.customers = value;
            this.OnPropertyChanged();
        }
    }

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多