【问题标题】:Is a WPF Derived Dependency Property Possible?WPF 派生的依赖属性是否可能?
【发布时间】:2012-08-06 05:21:03
【问题描述】:

我想公开一个属性,它是其他两个依赖属性的字符串格式。我该如何进行这项工作,以便在更新真正的依赖属性时也更新绑定到派生属性的任何内容?

public static readonly DependencyProperty DeviceProperty =
    DependencyProperty.Register("Device", typeof(string), typeof(SlaveViewModel));

public static readonly DependencyProperty ChannelProperty =
    DependencyProperty.Register("Channel", typeof(Channels), typeof(SlaveViewModel));

public string Device
{
    get { return (string)GetValue(DeviceProperty); }
    set { SetValue(DeviceProperty, value); }
}

public Channels Channel
{
    get { return (Channels)GetValue(ChannelProperty); }
    set { SetValue(ChannelProperty, value); }
}

现在我希望能够绑定到以下派生属性并将其视为依赖属性:

public string DeviceDisplay
{
    get 
    {
        return string.Format("{0} (Ch #{1})", Device, (int)Channel);
    }
}

我可以通过添加回调来做到这一点。它运作良好,但似乎有点冗长。除了以下方法之外,还有更简单的方法吗?

public static readonly DependencyProperty DeviceProperty =
    DependencyProperty.Register("Device", typeof(string), typeof(SlaveViewModel),
    new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.None,
    new PropertyChangedCallback(OnDevicePropertyChanged)));

private static void OnDevicePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    SlaveViewModel model = (SlaveViewModel)sender;
    model.DeviceDisplay = string.Format(string.Format("{0} (Ch #{1})",
        args.NewValue, (int)model.Channel));
}

public static readonly DependencyProperty ChannelProperty =
    DependencyProperty.Register("Channel", typeof(Channels), typeof(SlaveViewModel),
    new FrameworkPropertyMetadata(Channels.Channel1, FrameworkPropertyMetadataOptions.None,
    new PropertyChangedCallback(OnChannelPropertyChanged)));

private static void OnChannelPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    SlaveViewModel model = (SlaveViewModel)sender;
    model.DeviceDisplay = string.Format(string.Format("{0} (Ch #{1})",
        model.Device, (int)args.NewValue));
}

public static readonly DependencyPropertyKey DeviceDisplayPropertyKey =
    DependencyProperty.RegisterReadOnly("DeviceDisplay", typeof(string),
    typeof(SlaveViewModel), new FrameworkPropertyMetadata(""));

public static readonly DependencyProperty DeviceDisplayProperty =
    DeviceDisplayPropertyKey.DependencyProperty;  

public string DeviceDisplay
{
    get { return (string)GetValue(DeviceDisplayProperty); }
    protected set { SetValue(DeviceDisplayPropertyKey, value); }
}

【问题讨论】:

    标签: wpf dependency-properties readonly


    【解决方案1】:

    我看到了复制粘贴的代码,您可以将两个回调都指向一个方法。不知道是否有更简单的方法,但我对此表示怀疑。

    (另外,typeof(SlaveViewModel) 暗示这是 VM 代码:由于线程关联性,我永远不会在 VM 中使用 DP。)

    【讨论】:

    • 好点,所以我想我的视图模型应该只使用 INotifyPropertyChanged 代替? DP 属性是否更适合 wpf 用户控件上的属性?
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多