是否可以将datacontext的属性绑定到另一个datacontext的属性

时间:2016-02-28 03:55:04

标签: c# wpf xaml mvvm

我有一个我在控件中用来定义颜色的类:

public class ColorModel : INotifyPropertyChanged {
    public Color Color{ get { ... } set { ... } }
}

我还有一个类,我希望用它来定义双色LinearGradient画笔:

public class GradientModel : INotifyPropertyChanged {
    public Color First{ get { ... } set { ... } }
    public Color Last{ get { ... } set { ... } }
}

这两个类都用作负责定义各自值的控件的DataContexts。

我希望能够使用我定义的ColorModel来指定GradientModel的First和Last颜色的值(使用两个单独的控件,每个控件都包含一个ColorModel作为DataContext。)

我正努力尽可能地坚持MVVM。

我该如何完成这项任务?

3 个答案:

答案 0 :(得分:2)

另一种实现此目的的方法是定义GradientModel,如下所示:

public class GradientModel : INotifyPropertyChanged {
    public ColorModel First{ get { ... } set { ... } }
    public ColorModel Last{ get { ... } set { ... } }
}

也就是说,不要将属性定义为Color,而是将它们定义为ColorModel。然后在构造函数中,订阅PropertyChanged事件并相应地更新您的成员。

注意:您必须更新从FirstFirst.Color的绑定路径,依此类推。

答案 1 :(得分:0)

  

我已经定义的ColorModel来指定GradientModel的First和Last颜色的值

.navbar{ position: relative; margin: -10px; } 实例中,订阅ColorModel的{​​{1}}机制实例。然后在订阅操作方法中,只检测属性GradientModel更改事件及其发生时间提取其值并相应地更新INotifyPropertyChangedColor的属性。

答案 2 :(得分:0)

  1. 根据规则,Binding仅适用于DependencyProperty的{​​{1}}。

  2. 制作DependencyObjectColorModel GradientModel

  3. 创建DependencyObject,以便设置MainViewModel

    Binding
  4. XAML(我在VM中使用了字符串类型而不是Color类型进行演示。)

    public class MainViewModel
    {
        public ColorModel CM1 { get; set; }
        public ColorModel CM2 { get; set; }
    
        public GradientModel GM { get; set; }
    
        public MainViewModel()
        {
            CM1 = new ColorModel();
            CM2 = new ColorModel();
            GM = new GradientModel();
    
            Binding b1 = new Binding("Color");
            b1.Source = CM1;
            b1.Mode = BindingMode.OneWay;
            BindingOperations.SetBinding(GM, GradientModel.FirstProperty, b1);
    
            Binding b2 = new Binding("Color");
            b2.Source = CM2;
            b2.Mode = BindingMode.OneWay;
            BindingOperations.SetBinding(GM, GradientModel.LastProperty, b2);
        }
    }
    
    <TextBox x:Name="Ctrl1" HorizontalAlignment="Left" Height="23" Margin="32,48,0,0" TextWrapping="Wrap" Text="{Binding CM1.Color}" VerticalAlignment="Top" Width="120"/>
    <TextBox x:Name="Ctrl2" HorizontalAlignment="Left" Height="23" Margin="32,103,0,0" TextWrapping="Wrap" Text="{Binding CM2.Color}" VerticalAlignment="Top" Width="120"/>