【翻譯】WPF中的數(shù)據(jù)綁定表達式
有很多文章討論綁定的概念,并講解如何使用StaticResources和DynamicResources綁定屬性。這些概念使用WPF提供的數(shù)據(jù)綁定表達式。在本文中,讓我們研究WPF提供的不同類型的數(shù)據(jù)綁定表達式。
介紹
數(shù)據(jù)綁定是一種強大的技術(shù),它允許數(shù)據(jù)在UI元素和業(yè)務(wù)模型之間流動。當業(yè)務(wù)模型中的數(shù)據(jù)發(fā)生變化時,它會自動將更改反映到UI元素上。

這可以通過WPF提供的不同類型的數(shù)據(jù)綁定表達式來實現(xiàn)。
數(shù)據(jù)綁定表達式的類型如下所示。
DataContext綁定
RelativeSource綁定
ItemSource綁定
1、DataContext綁定
DataContext是一個依賴屬性,它是綁定的默認源。Datacontext沿著邏輯樹繼承。因此,如果您設(shè)置一個DataContext來控制邏輯樹中的所有子元素,它也將引用同一個DataContext,除非并且直到顯式指定了另一個源。
讓我們舉個例子來更詳細地理解它。
1.1 創(chuàng)建一個類Book,如下所示。
1.2 添加一個XAML文件DataContextBinding.XAML
并放置四個TextBlock,如下所示。

現(xiàn)在,讓我們看看如何使用這個DataContext屬性來顯示數(shù)據(jù)。
它有兩種用法,如下所示。
1.使用{Binding}表達式
用于直接綁定DataContext。
創(chuàng)建類Book的實例,初始化其屬性,并將類的Name屬性分配給Window的DataContext屬性。
由于DataContext是沿著邏輯樹和數(shù)據(jù)book繼承的,因此Name被綁定到Control Window。Window的所有子元素也將引用同一個對象(book.Name)。
要顯示數(shù)據(jù),請將DataContext與Textblock綁定,如下所示。

輸出

使用{Binding Property}表達式
綁定Datacontext的屬性。
創(chuàng)建類Book的實例,初始化其屬性并將類的實例(Book)分配給Window的DataContext屬性。
現(xiàn)在,讓我們看看輸出。

由于綁定表達式{Binding}用于綁定Book類型的DataContext對象,因此調(diào)用ToString()方法,并將數(shù)據(jù)顯示為字符串。為了以正確的格式顯示數(shù)據(jù),我們必須將數(shù)據(jù)對象的屬性與TextBlock綁定,如下所示:

綁定表達式{Binding Name}用于綁定DataContext綁定的Name屬性。
輸出

2、RelativeSource 綁定
RelativeSource是一個屬性,它用相對關(guān)系設(shè)置綁定源以綁定目標。此擴展主要用于必須將元素的一個屬性綁定到同一元素的另一個屬性時。
RelativeSource有四種類型,如下所示。
Self
FindAncestor
TemplatedParent
PreviousData
讓我們一個一個詳細地探討一下。
2.1 Self
Self用于綁定源和綁定目標相同的場景中。對象的一個屬性與同一對象的另一個屬性綁定。
例如,讓我們?nèi)∫粋€高度和寬度相同的橢圓。
在XAML文件中添加下面給出的代碼。寬度屬性與高度屬性相對綁定。

輸出

如果改變橢圓的高度,寬度也會相對變化。
2.2 FindAncestor
顧名思義,當綁定源是綁定目標的祖先(父級)之一時使用此選項。使用FindAncestor擴展,可以找到任何級別的祖先。
讓我們舉個例子來更清楚地理解它。
步驟
創(chuàng)建XAML,它表示下面給出的元素的邏輯樹。


現(xiàn)在,讓我們使用FindAncestor擴展將祖先的Name屬性綁定到子元素button的Content屬性。

輸出

AncestorType為“StackPanel”與AcestorLevel為“2”組合,將button的content屬性與StackPanel的Name屬性(Parent_2)綁定在一起。
2.3 TemplatedParent
TemplatedParent是一個屬性,它使您能夠創(chuàng)建一個包含少量未知值的控件模板。這些值取決于應(yīng)用ControlTemplate的控件的屬性。
讓我們舉個例子來更詳細地理解它
步驟
為按鈕創(chuàng)建一個ControlTemplate,如下所示。

在上面給出的代碼中,橢圓的Fill屬性和ContentPresenter的Content屬性依賴于將應(yīng)用此模板的控件的屬性值。
2. 添加一個按鈕并對其應(yīng)用模板。

在應(yīng)用模板時,按鈕的Background(Beige)與橢圓的Fill屬性相對綁定,Content(Click me)與ContentPresenter的Content屬性相對綁定。依賴值生效并給出以下輸出。
輸出

2.4 PreviousData
這是相對使用最少的方式。當數(shù)據(jù)被分析時,這就出現(xiàn)了,我們需要表示值相對于以前數(shù)據(jù)的變化。
讓我們舉個例子來更詳細地理解它。
步驟
創(chuàng)建一個類Data并實現(xiàn)INotifyPropertyChanged接口,如下所示
2.創(chuàng)建一個Data類型的列表并將其指定為DataContext。
3.在XAML文件中添加ItemsControl。
<ItemsControl ItemsSource="{Binding}"></ItemsControl> ?
4.為其創(chuàng)建ItemsPanel模板,如下。

5.現(xiàn)在,為了正確地表示數(shù)據(jù),創(chuàng)建DataTemplate,如下所示。

輸出

藍色框的高度是列表中項目的值,舊數(shù)據(jù)顯示在右側(cè)。該項的第一個值為“60”。因此,第一項沒有舊值。
3、ItemSource綁定
在處理集合時使用。使用這個綁定表達式,您可以非常容易地讀取SelectedItem的屬性。斜杠是一種特殊運算符,用于處理集合中的當前項。
下面給出了三種表達式。
{Binding / }
{Binding Collection / }
{Binding Collection / Property}
3.1 {Binding / }
此表達式用于綁定DataContext中的當前項。
讓我們采取一個示例:
在下面給出的示例中,DataContext是字符串類型的國家/地區(qū)的集合,并且與Listbox綁定在一起。
步驟
創(chuàng)建一個Countries類并添加一個GetCountriesName()方法,該方法返回string數(shù)據(jù)類型的國家的集合,如下所示。
2.添加一個XAMl文件,一個ListBox和TextBlock,如下所示。

3.創(chuàng)建類Countries的實例并將Countries集合指定為DataContext。
4.綁定TextBlock的Text屬性以將其綁定到集合的當前選定項,如下所示。
<TextBlock DockPanel.Dock="Top" Text="{Binding /}" /> ?
輸出

一旦列表項被選中,它將在右側(cè)顯示所選國家/地區(qū)。
3.2 {Binding Collection /}
此表達式用于綁定DataContext中集合屬性的當前項。
例如,
DataContext是Countries類
Collection屬性是CounriesList,它與ListBox綁定。
步驟
使用上面創(chuàng)建的類似的國家類,只是略有不同。創(chuàng)建返回類型為RegionInfo的方法。
2.添加RegionInfo類型的CountriesList屬性。
下面是CountriesList集合中的值的截圖。

3.將類Countries指定為DataContext,并將Listbox與DataContext的CountriesList屬性綁定。

4.要計算CountriesList屬性的當前項,請綁定TextBlock的Text屬性,如下所示。
<TextBlock DockPanel.Dock="Top" Text="{Binding CountriesList/}" HorizontalAlignment="Center" FontSize="16" VerticalAlignment="Center" />
輸出

右側(cè)顯示DataContext(CountriesList)中集合的當前項(CountriesList)。
3.3 {Binding Collection / Property}
此表達式用于綁定DataContext中集合的當前項的屬性。
例如,如果必須計算CountriesList集合的當前項的特定屬性。
在這個例子中,我想顯示屬性“EnglishName”的值。

為此,綁定TextBlock的Text屬性,如下所示。
<TextBlock DockPanel.Dock="Top" Text="{Binding CountriesList/EnglishName}" /> ?
輸出

現(xiàn)在,當列表中的項被選中時,它顯示屬性“EnglishName”的值。
結(jié)論
我已經(jīng)詳細介紹了所有的數(shù)據(jù)綁定表達式。我希望這有助于您理解綁定的概念和WPF提供的表達式。
時間如流水,只能流去不流回。
作者:Swati Gupta
原文標題:DataBinding Expressions In WPF
原文鏈接:https://www.c-sharpcorner.com/article/data-binding-expression-in-wpf/
翻譯、編輯:沙漠盡頭的狼
公眾號:Dotnet9
日期:2021-05-04