我有一个我在控件中用来定义颜色的类:
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。
我该如何完成这项任务?
答案 0 :(得分:2)
另一种实现此目的的方法是定义GradientModel
,如下所示:
public class GradientModel : INotifyPropertyChanged {
public ColorModel First{ get { ... } set { ... } }
public ColorModel Last{ get { ... } set { ... } }
}
也就是说,不要将属性定义为Color
,而是将它们定义为ColorModel
。然后在构造函数中,订阅PropertyChanged
事件并相应地更新您的成员。
注意:您必须更新从First
到First.Color
的绑定路径,依此类推。
答案 1 :(得分:0)
我已经定义的ColorModel来指定GradientModel的First和Last颜色的值
在.navbar{
position: relative;
margin: -10px;
}
实例中,订阅ColorModel
的{{1}}机制实例。然后在订阅操作方法中,只检测属性GradientModel
更改事件及其发生时间提取其值并相应地更新INotifyPropertyChanged
和Color
的属性。
答案 2 :(得分:0)
根据规则,Binding
仅适用于DependencyProperty
的{{1}}。
制作DependencyObject
和ColorModel
GradientModel
。
创建DependencyObject
,以便设置MainViewModel
。
Binding
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"/>