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);
    }
    }
    
  • XAML(为了演示,我在虚拟机中使用了字符串类型而不是颜色类型。)

    
    
    我不得不说我同意这种方法。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"/>