WPF - 在不同的对话框上绑定两个属性

时间:2012-11-28 09:49:52

标签: c# wpf

我在不同的XAML文件中与CheckBox相关的不同对话框(类)有两个选项:

第一对:

C#:

public class FirstClass : DependencyObject
{
   public static readonly DependencyProperty testProperty = 
      DependencyProperty.Register("testProperty", typeof(bool),
      typeof(FirstClass), 
      new UIPropertyMetadata(false));

   public bool testProperty
   {
      get { return (bool)this.GetValue(testProperty); }
      set { this.SetValue(testProperty, value); }
   }
}

XAML:

<CheckBox IsChecked="{Binding Path=testProperty, Mode=TwoWay}">

第二对:

C#

public class SecondClass : DependencyObject
{
   public static readonly DependencyProperty testProperty =
      FirstClass.testProperty.AddOwner(typeof(SecondClass));

   public bool testProperty
   {
      get { return (bool)this.GetValue(testProperty); }
      set { this.SetValue(testProperty, value); }
   }
}

XAML:

<CheckBox IsChecked="{Binding Path=testProperty, Mode=TwoWay}">

我想将第一个对话框中的选项绑定到第二个对话框中的选项(A&lt; =&gt; B)。如果选中第一个对话框中的CheckBox,则还应检查第二个对话框中的CheckBox。我应该为此目的使用 ApplicationSettings 吗?

1 个答案:

答案 0 :(得分:2)

DataBinding不仅是两个依赖项属性之间的绑定过程,也是一个CLR和一个依赖项属性之间的绑定过程。实际上,它通常是最常见的绑定方案。所以你可以做的是使用一个模型对象来存储你的ui元素的值,并在另一个视图或另一个控件中重用它。 首先,我建议你不要使用DependencyObject派生对象作为你的数据持有者,虽然它仍然有效,它也有它的缺点。

首先是我们的数据对象,它只存储我们的数据。请查看如何实现INotifyPropertyChanged接口,因为我离开了实现以便于阅读。

class DataHolder : INotifyPropertyChanged
{
    public bool MyValue
    {
        get{return mMyValue;}
        set{mMyValue = value; RaiseProperty("MyValue");}
    }

    private bool mMyValue;
}

现在可以借助UI DataContext轻松地将此对象绑定到您的ui元素。知道DataContext是一个继承的依赖属性至关重要,这意味着在控件树中,如果一个元素没有set datacontext,它会自动获取其父级的datacontext。想象一下带有用户名和密码的登录对话框。如果您有一个具有两个属性(如用户名和密码)的简单模型,则只需将此模型设置为对话框的datacontext,并且所有控件都可以绑定到这些属性。回到您的示例,您只需将DataHolder的实例设置为窗口datacontext属性

public MainWindow()
{
    InitializeComponents();
    var model = new DataHolder();
    DataContext = model;
}

现在您可以在xaml中使用绑定,如下所示

<CheckBox IsChecked="{Binding MyValue, Mode=TwoWay}"/>

多个控件可以绑定到同一个属性,并且在打开另一个视图时可以使用相同的模型。

最后一条建议,您应该阅读DataBinding chapter of the msdn并了解MVVM pattern是一个好主意,因为它广泛用于WPF取得了巨大成功。我们将它用于相当大的应用程序,并对它非常满意。