> 文档中心 > WPF Binding绑定模式

WPF Binding绑定模式

Binding是WPF 应用程序中的一种机制,它为应用程序提供了一种简单易用的方式来显示数据并与之交互。它允许数据在 UI 和业务模型之间流动。绑定完成后对业务模型中的数据所做的任何修改都会自动反映到 UI,反之亦然。

绑定可以是单向的或双向的。数据绑定的源可以是普通的 .NET 属性或 Dependency 属性,但目标属性必须是Dependency属性。

为了使绑定正常工作,属性的双方都必须提供通知中的更改,这将告诉绑定更新目标值。在普通的 .NET 属性中,可以通过使用INotifyPorpertyChanged接口来实现。而对于Dependency属性,它是由属性元数据的PropertyChanged回调完成的。

数据绑定模式:

模式 描述
OneWay 源 → 目标
TwoWay 源 ←→ 目标
OneWayToSource 源 ← 目标
OneTime 源 → 目标 (仅一次)

这可以通过 WPF 提供的不同类型的数据绑定表达式来实现。

下面给出了数据绑定表达式的类型。

  • 数据上下文绑定
  • 相对源绑定
  • 集合绑定的当前项目

数据上下文绑定

DataContext 是一个 Dependency 属性,它是默认的绑定源。数据上下文沿逻辑树继承。因此,如果您设置一个数据上下文来控制逻辑树中的所有子元素,它也将引用相同的数据上下文,除非并且直到明确指定另一个源。

  • 创建一个类Book,如下:
public class Book {      public string Name     {   get;   set;      }      public string Author     {   get;   set;      }  }  
  • 添加一个 XAML 文件 DataContextBinding.xaml 并放置四个 Textblock,如下所示。
                                                                

现在,让我们看看如何使用这个 DataContext 属性来显示数据。

它有两种使用方式,如下所示。

  1. 使用 {Binding} 表达式

    用于直接绑定 DataContext。
    创建类 Book 的实例,初始化其属性并将类的 Name 属性分配给 Window 的 DataContext 属性。

public partial class DataContextBinding: Window {      public DataContextBinding()     {   InitializeComponent();   //Create the instance   Book book = new Book();   //initialize the properties   book.Name = "Computer Networking";   //Assign the Property as DataContext   this.DataContext = book.Name;      }  }  

由于 Datacontext 是沿逻辑树和数据簿继承的,因此 name 绑定到 Control Window。Window 的所有子元素也将引用同一个对象(book.Name)。

要显示数据,请将 DataContext 与 Textblock 绑定,如下所示。

     
  1. 输出

  1. 使用 {Binding Property} 表达式

    绑定 Datacontext 的属性。
    创建一个 Book 类的实例,初始化它的属性并将类(book)的实例分配给 Window 的 DataContext 属性。

 Book book = new Book();  //initialize the properties  book.Name = "Computer Networking";  book.Author = "James F. Kurose";  //Assign the instance as DataContext  this.DataContext = book;  

现在,让我们看看输出。

由于绑定表达式 {Binding} 用于绑定 Book 类型的 DataContext 对象,因此在其上调用 ToString() 方法并将数据显示为字符串。为了以正确的格式显示数据,我们必须绑定属性带有文本块的数据对象,如下图所示:

      

绑定表达式{Binding Name}用于绑定DataContext绑定的Name属性。

输出

RelativeSource Binding

RelativeSource 是一个属性,它设置绑定源与绑定目标的相对关系。当您必须将元素的一个属性绑定到同一元素的另一个属性时,主要使用此扩展。

有四种类型的RelativeSource,如下所示。

  1. Self
  2. FindAncestor
  3. TemplatedParent
  4. PreviousData

让我们一一详细探讨。

Self

Self用于一个场景,当Binding源和绑定目标相同时。对象的一个​​属性与同一对象的另一个属性绑定。

例如 - 让我们采用具有相同高度和宽度的椭圆。

在 XAML 文件中添加下面给出的代码。宽度属性与高度属性相对绑定。

                 

输出

如果 Ellipse 的高度发生变化,宽度也会相对变化。

FindAncestor

顾名思义,这在绑定源是绑定目标的祖先(父母)之一时使用。使用 FindAncestor 扩展,您可以找到任何级别的祖先。

让我们举个例子来更清楚地理解它。

创建 XAML,它表示下面给出的元素的逻辑树。

                          

现在,让我们使用 FindAncestor 扩展将祖先的名称属性绑定到子元素按钮的内容属性。

                      

输出

AncestorType “StackPanel” 结合 AcestorLevel as “2” 将 button 的 content 属性与 StackPanel (Parent_2) 的 Name 属性绑定。

TemplatedParent

TemplatedParent 是一个属性,它使您能够创建具有少量未知值的控件模板。这些值取决于应用 ControlTemplate 的控件的属性。

让我们举个例子来更详细地理解它

  • 为按钮创建一个ControlTemplate,如下所示。
             

在上面给出的代码中,Ellipse 的示例 Fill 属性和 ContentPresenter 的 Content 属性取决于将应用此模板的控件的属性值。

  • 添加一个按钮并将模板应用到它。
   

在应用模板时,按钮的Background(Beige)与Ellipse的Fill属性相对绑定,Content(点我)与ContentPresenter的Content属性相对绑定。评估相关值并给出下面给出的输出。
输出:

PreviousData

这是RelativeSource 最少使用的模式。这在分析数据时出现,我们需要表示相对于先前数据的值变化。

让我们举个例子来更详细地理解它。

  • 创建一个Data类并实现INotifyPropertyChanged接口,如下图
public class Data: INotifyPropertyChanged {      public int DataValue     {   get;   set;      }      public event PropertyChangedEventHandler PropertyChanged;      protected void OnPropertyChanged(string PropertyName)     {   if (null != PropertyChanged)  {PropertyChanged(this,    new PropertyChangedEventArgs(PropertyName));   }      }  }   
  • 创建一个列表以键入 Data 并将其分配为 DataContext。
public RelativeSourcePreviousData() {      InitializeComponent();      List  data = new List  ();      data.Add(new Data()     {   DataValue = 60      });      data.Add(new Data()     {   DataValue = 100      });      data.Add(new Data()     {   DataValue = 120      });      this.DataContext = data;  }   
  • 在 XAML 文件中添加 ItemsControl。
  
  • 为其创建 ItemsPanel 模板,如下所示。
                      
  • 现在,为了正确表示数据,创建 DataTemplate,如下所示。
                          

输出

蓝色框的高度是列表中项目的值,之前的数据显示在框的右侧。项目的第一个值为“60”。因此,先前的数据显示第一项没有价值。

旅游攻略大全