是否可以将数据上下文的属性绑定到另一个数据上下文的属性
本文关键字:属性 数据 上下文 另一个 绑定 是否 | 更新日期: 2023-09-27 18:36:29
我有一个类,我在控件中使用它来定义颜色:
public class ColorModel : INotifyPropertyChanged {
public Color Color{ get { ... } set { ... } }
}
我还有一个类,我希望用它来定义双色线性渐变画笔:
public class GradientModel : INotifyPropertyChanged {
public Color First{ get { ... } set { ... } }
public Color Last{ get { ... } set { ... } }
}
这两个类都充当负责定义其各自值的控件的数据上下文。
我希望能够使用我定义的 ColorModel 来指示 GradientModel 的第一个和最后一个颜色的值(使用两个单独的控件,每个控件都包含一个 ColorModel 作为 DataContext)。
我正在努力尽可能严格遵守 MVVM。
我怎样才能完成这项任务?
实现此目的的另一种方法是按如下方式定义GradientModel
:
public class GradientModel : INotifyPropertyChanged {
public ColorModel First{ get { ... } set { ... } }
public ColorModel Last{ get { ... } set { ... } }
}
也就是说,不是将属性定义为Color
,而是将它们定义为 ColorModel
。然后在构造函数中,订阅PropertyChanged
事件并相应地更新成员。
注意:您必须将绑定路径从First
更新为First.Color
,依此类推。
我定义的用于指示梯度模型的第一个和最后一个颜色的值的颜色模型
ColorModel
实例中,订阅GradientModel
的INotifyPropertyChanged
机制的实例。然后在订阅操作方法中,只需检测属性Color
更改事件,并在发生时提取其值并相应地更新First
和Last
的属性。
-
根据规则,
Binding
仅适用于DependencyObject
的DependencyProperty
。 -
做
ColorModel
,GradientModel
DependencyObject
。 -
创建一个
MainViewModel
以便您可以设置Binding
。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"/>
XAML(我在演示的 VM 中使用了字符串类型而不是颜色类型。
<TextBlock HorizontalAlignment="Left" Height="23" Margin="210,77,0,0" TextWrapping="Wrap" Text="{Binding GM.First}" VerticalAlignment="Top" Width="120" Background="#FFE8D7D7"/>
<TextBlock HorizontalAlignment="Left" Height="23" Margin="352,77,0,0" TextWrapping="Wrap" Text="{Binding GM.Last}" VerticalAlignment="Top" Width="120" Background="#FFECD7D7"/>