是否有*clean*方法使只读依赖项属性反映另一个属性的值?

Gif*_*guy 5 .net c# data-binding wpf dependency-properties

下面的代码是我目前的解决方案.

如果你花了几分钟来弄清楚这段代码在做什么,我听到你了.

如果有的话,这是一个丑陋的混乱.我会杀死看到另一种选择,(但不要让那些阻止你回应...... :-).哦,jeez,我甚至通过删除转换器代码来缩小它(基本上),当我查看这段代码时,我仍感到诵读困难.

我试图模仿的一个很好的例子是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 { }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 4

不幸的是,您将需要您拥有的大部分东西。在这种情况下不需要 IValueConverter,因此您可以将其简化为:

public class foo : FrameworkElement
{
    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)
    {
         foo f = d as foo;
         if (f != null)
         {
              int iVal;
              if (int.TryParse(f.ReadWriteStr, out iVal))
                  f.SetValue( ReadOnlyIntPropertyKey, iVal);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)