C# 是否可以将datacontext的属性绑定到另一个datacontext的属性
我在控件中使用了一个类来定义颜色:C# 是否可以将datacontext的属性绑定到另一个datacontext的属性,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我在控件中使用了一个类来定义颜色: public class ColorModel : INotifyPropertyChanged { public Color Color{ get { ... } set { ... } } } 我还希望使用一个类来定义双色线性渐变笔刷: public class GradientModel : INotifyPropertyChanged { public Color First{ get { ... } set { ... } }
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
我怎样才能着手完成这项任务
ColorModel,我定义它来指定GradientModel的第一个和最后一个颜色的值
在
ColorModel
实例中,订阅GradientModel
的INotifyPropertyChanged
机制的实例。然后,在订阅操作方法中,只需检测属性Color
change事件,并在事件发生时提取其值,并相应地更新First
和Last
的属性。实现这一点的另一种方法可能是定义GradientModel
,如下所示:
public class GradientModel : INotifyPropertyChanged {
public ColorModel First{ get { ... } set { ... } }
public ColorModel Last{ get { ... } set { ... } }
}
也就是说,不要将属性定义为Color
,而是将它们定义为ColorModel
。然后在构造函数中,订阅PropertyChanged
事件并相应地更新您的成员
注意:您必须将绑定路径从First
更新为First.Color
等等
绑定
仅对DependencyObject
的dependencProperty
有效ColorModel
,和GradientModel
DependencyObject
MainViewModel
,以便可以设置绑定
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"/>
public类主视图模型
{
公共颜色模型CM1{get;set;}
公共颜色模型{get;set;}
公共梯度模型GM{get;set;}
公共主视图模型()
{
CM1=新的ColorModel();
CM2=新颜色模型();
GM=新梯度模型();
装订b1=新装订(“颜色”);
b1.来源=CM1;
b1.Mode=BindingMode.OneWay;
BindingOperations.SetBinding(GM,GradientModel.FirstProperty,b1);
绑定b2=新绑定(“颜色”);
b2.源=CM2;
b2.Mode=BindingMode.OneWay;
BindingOperations.SetBinding(GM,GradientModel.LastProperty,b2);
}
}
我不得不说我同意这种方法。WPF绑定引擎旨在促进视图和视图模型之间的松散绑定。问题涉及视图模型之间的绑定,因此,至少您需要能够独立于视图运行并与单元测试等兼容的东西。仅仅因为某些东西最初看起来很方便,并不意味着它是您试图解决的问题的正确技术。是否有任何理由为ColorModel
属性指定一个setter?我这样问是因为在模型中需要定义ColorModel
对象,然后我将为负责它的控件提供DataContext
。这就成功了。这是我当时的想法,但我不是100%确定。
<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"/>