首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM CallerMemberName和“魔术字符串”

MVVM CallerMemberName和“魔术字符串”
EN

Stack Overflow用户
提问于 2013-02-23 18:21:37
回答 3查看 3.4K关注 0票数 1

新的C# 5.0版本引入了一些在INotifyPropertyChanged实现中摆脱“魔法字符串”的东西,比如:

代码语言:javascript
复制
OnPropertyChanged("CustomerName");

现在可以只写:

代码语言:javascript
复制
OnPropertyChanged();

这可能是由于方法定义中的CallerMemberName:

代码语言:javascript
复制
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ ... }

它比“魔术字符串”的方式更有利于重构,也比lambda表达式更快,但我想知道如何从一个集合访问器调用多次OnPropertyChanged。例如,如果我们想要这样的东西:

代码语言:javascript
复制
public int Width
{
    get
    {
        return width;
    }
    set
    {
        width = value;
        OnPropertyChanged("Width");
        OnPropertyChanged("Height");
    }
}

我们如何通过CallerMemberName方式做到这一点,并避免使用“魔法字符串”和lambda表达式?

我还想知道如何避免在IDataError信息中使用“魔法字符串”:

代码语言:javascript
复制
public string Error
        {
            get;
            private set;
        }

        public string this[string columnName]
        {
            get
            {
                if (columnName == "Name")
                {
                    if (String.IsNullOrWhiteSpace(Name))
                        Error = "Name cannot be null or empty.";
                    else
                        Error = null;
                }

                return Error;
            }
        }

我是MVVM的新手,所以可能我忽略了一些处理“魔法字符串”的聪明方法,但是我做了一些研究,什么也没有发现。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-23 18:29:34

简单的答案是,你不能这样做。如名称CallerMemberName所示,它将包含调用者的名称。

对于想要为另一个而不是当前的PropertyChanged调用的情况,您必须使用一种“旧”方法。

IDataErrorInfo中,您也必须使用这些方法中的一种,没有其他选择。

票数 4
EN

Stack Overflow用户

发布于 2015-05-15 20:16:42

我知道这个问题是关于C# 5.0的,但是如果人们仍然有这样的问题,请查看c# 6.0。C# 6.0有一个很好的方法来解决这个问题。查看nameof关键字。如果有人感兴趣,我写了一篇关于它的小文章:c# 6.0 solves magic strings problem

票数 1
EN

Stack Overflow用户

发布于 2013-11-05 19:55:18

这将会有帮助:“某种魔力”毫不费力的INotifyPropertyChanged

http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a

作为将其添加到一个属性的示例:

代码语言:javascript
复制
[Magic] 
public string Name { get { return _name; } set { _name = value; } } 
string _name;

将其添加到所有类属性的另一个示例:

代码语言:javascript
复制
[Magic] 
public class MyViewModel: INotifyPropertyChanged 
{ 
  public string Name { get; set; } 
  public string LastName { get; set; } 
  ..... 
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15039415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档