我们有一个 DependencyObject,它将 Value 属性定义为 DP。它还定义了一个 Presets 集合,表示一些预定义值的友好名称。
我们的 UI 应该工作的方式是当我们绑定到 Value 属性时,如果该值与预设匹配,我们显示友好名称,否则我们直接显示该值。
使用转换器已经过时了,因为没有可靠的方法既可以传入 Presets(它们是按项目定义的,它们不是共享的)也可以进行双向绑定,所以我们的想法是在对象上公开 FriendlyValue 属性并将其用于 UI 中的绑定,让它在内部处理转换。
由于 FriendlyValue 依赖于已经存在的 Value DependencyProperty,我们认为我们只需将转换逻辑包装在 CLR getter/setter 中,但这意味着当实际 Value DP 发生变化时,它需要通知 UI FriendlyValue 也已更新,并且由于 FriendlyValue 是 CLR 属性,因此我们需要为该特定属性支持 INPC。
我的问题是,处理这个问题的正确/建议方法是,还是我应该使用第二个 DP,监视其更改处理程序并相应地设置另一个属性,添加状态变量以阻止一个设置另一个,然后设置首先,然后再次更新另一个,等等。
这是对象属性的代码...
public static readonly DependencyProperty PresetsProperty = DependencyProperty.Register(
"Presets",
typeof(List<Preset>),
typeof(MyObject),
new UIPropertyMetadata(null));
public List<Preset> Presets
{
get { return (List<Preset>)GetValue(PresetsProperty); }
set { SetValue(PresetsProperty, value); }
}
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value",
typeof(string),
typeof(MyObject),
new UIPropertyMetadata(null, (s,e) => {
var myObject = (MyObject)s;
myObject.OnPropertyChanged("FriendlyValue");
}));
public string Value
{
get { return (string)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public string FriendlyValue
{
get
{
var foundPreset = Presets.FirstOrDefault(preset => preset.Value == this.Value);
return (foundPreset != null)
? foundPreset.FriendlyName
: this.Value;
}
set
{
var foundPreset = Presets.FirstOrDefault(preset => preset.FriendlyName == value);
this.Value = (foundPreset != null)
? foundPreset.Value
: value;
// Note: We don't raise INPC notification here. It's raised in the Value's change handler
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
那么这是否被认为是内置转换器行为的良好做法?