1

新しいC#5.0リリースでは、INotifyPropertyChanged実装の「マジックストリング」を取り除くために次のようなものが導入されました。

OnPropertyChanged("CustomerName");

これで、次のように書くことができます。

OnPropertyChanged();

メソッド定義のCallerMemberNameが原因で可能です。

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ ... }

「マジックストリング」の方法よりもリファクタリングに適していて、ラムダ式よりも高速ですが、1つのセットアクセサーからOnPropertyChangedを複数回呼び出すにはどうすればよいのでしょうか。たとえば、次のようなものが必要な場合:

public int Width
{
    get
    {
        return width;
    }
    set
    {
        width = value;
        OnPropertyChanged("Width");
        OnPropertyChanged("Height");
    }
}

CallerMemberNameの方法でこれを行い、「マジックストリング」とラムダ式の使用を回避するにはどうすればよいですか?

また、IDataError情報で「マジックストリング」の使用を回避するにはどうすればよいのでしょうか。

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を初めて使用するため、「マジックストリング」を処理するための巧妙な方法を見落とした可能性がありますが、調査を行っても何も見つかりませんでした。

4

3 に答える 3

4

簡単な答えは、それはできないということです。名前CallerMemberNameが示すように、呼び出し元の名前が含まれます。現在のものとは別の方法で
レイズしたい場合は、「古い」方法のいずれかを使用する必要があります。PropertyChanged

またIDataErrorInfo、これらの方法のいずれかを使用する必要がある場合、代替手段はありません。

于 2013-02-23T10:29:34.363 に答える
-1

これは役に立ちます: 「一種の魔法」

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

1 つのプロパティに追加する例として:

[Magic] 
public string Name { get { return _name; } set { _name = value; } } 
string _name;

すべてのクラス プロパティに追加する別の例:

[Magic] 
public class MyViewModel: INotifyPropertyChanged 
{ 
  public string Name { get; set; } 
  public string LastName { get; set; } 
  ..... 
}
于 2013-11-05T11:55:18.423 に答える