下面的代码是我目前的解决方案。
如果您需要几分钟才能弄清楚这段代码在做什么,我听到了。
如果有的话,这是一个丑陋的混乱。我会杀了看到另一种选择,(但不要让这阻止你回应...... :-)。哦,天哪,我什至(基本上)通过删除转换器代码来缩写它,当我看到这段代码时,我仍然感到阅读障碍。
我试图模仿的一个很好的例子是 FrameworkElement.ActualWidth 属性。您知道如何计算和重新分配 ActualWidth 属性,无论何时 Width 属性更改,或何时重绘控件,或其他任何时候?------
从开发人员的角度来看,它看起来就像是数据绑定在努力工作。
但 ActualWidth 是一个只读的依赖属性。微软真的必须通过这个巨大的代码垃圾洞才能使其工作吗?或者有没有更简单的方法来利用数据绑定系统的现有功能?
public class foo : FrameworkElement
{
[ValueConversion(typeof(string), typeof(int))]
public class fooConverter : IValueConverter
{ public object Convert( object value, Type targetType,
object parameter, CultureInfo culture)
{ ... }
public object ConvertBack( object value, Type targetType,
object parameter, CultureInfo culture)
{ ... }
}
private static readonly fooConverter fooConv = new fooConverter();
private static readonly DependencyPropertyKey ReadOnlyIntPropertyKey =
DependencyProperty.RegisterReadOnly( "ReadOnlyInt", typeof(int),
typeof(foo), null);
public int ReadOnlyInt
{ get { return (int)GetValue(ReadOnlyIntPropertyKey.DependencyProperty); }
}
public static readonly DependencyProperty ReadWriteStrProperty =
DependencyProperty.Register( "ReadWriteStr", typeof(string), typeof(foo),
new PropertyMetadata(ReadWriteStr_Changed));
public string ReadWriteStr
{ get { return (string)GetValue(ReadWriteStrProperty); }
set { SetValue(ReadWriteStrProperty, value); }
}
private static void ReadWriteStr_Changed( DependencyObject d,
DependencyPropertyChangedEventArgs e)
{ try
{ if (d is foo)
{ foo f = d as foo;
f.SetValue( ReadOnlyIntPropertyKey,
fooConv.Convert(f.ReadWriteStr, typeof(int), null,
CultureInfo.CurrentCulture));
}
}
catch { }
}
}