アクセシビリティに基づいてプロパティの WPF バインディングを生成するクラスを作成しています。主な方法は次のとおりです。
static Binding getBinding(PropertyInfo prop)
{
var bn = new Binding(prop.Name);
bn.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
if (prop.CanRead && prop.CanWrite)
bn.Mode = BindingMode.TwoWay;
else if (prop.CanRead)
bn.Mode = BindingMode.OneWay;
else if (prop.CanWrite)
bn.Mode = BindingMode.OneWayToSource;
return bn;
}
ただし、これは期待どおりに機能しません。CanWrite
それが偽であるtrue
べきときです。たとえば、このプロパティの場合:
abstract class AbstractViewModel {
public virtual string DisplayName { get; protected set; }
}
class ListViewModel : AbstractViewModel {
//does not override DisplayName
}
DisplayName
a のプロパティはと のListViewModel
両方CanRead
であることがわかりましたCanWrite
。ただし、 を呼び出すとprop.GetAccessors()
、get_DisplayName()
アクセサーのみがリストされます。
ここで何が起こっているのですか?プロパティの保護レベルではない場合、何CanRead
を示し、何を示していますか? CanWrite
私のメソッドの正しい実装は何ですか?