2012-08-09 80 views
2

我想公开一个属性是两个其他依赖项属性的字符串格式。我如何使这项工作,所以绑定到派生属性的任何东西也会在更新真正的依赖项属性时更新?是否可以使用WPF派生的依赖项属性?

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); } 
} 

回答

0

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

(也是typeof(SlaveViewModel)表明,这是VM代码:我为一个永远不会在一个虚拟机可以使用DPS,因为线程亲和力。)

+1

好一点,所以我想我的视图模型应该只使用INotifyPropertyChanged的呢? DP属性更适合wpf usercontrols上的属性吗? – 2012-08-09 02:09:35

+0

@JasonButera:是的,是的。 – 2012-08-09 02:11:00