WPF Binding绑定模式
Binding是WPF 應(yīng)用程序中的一種機(jī)制,它為應(yīng)用程序提供了一種簡單易用的方式來顯示數(shù)據(jù)并與之交互。它允許數(shù)據(jù)在 UI 和業(yè)務(wù)模型之間流動。綁定完成后對業(yè)務(wù)模型中的數(shù)據(jù)所做的任何修改都會自動反映到 UI,反之亦然。
綁定可以是單向的或雙向的。數(shù)據(jù)綁定的源可以是普通的 .NET 屬性或 Dependency 屬性,但目標(biāo)屬性必須是Dependency屬性。
為了使綁定正常工作,屬性的雙方都必須提供通知中的更改,這將告訴綁定更新目標(biāo)值。在普通的 .NET 屬性中,可以通過使用INotifyPorpertyChanged接口來實現(xiàn)。而對于Dependency屬性,它是由屬性元數(shù)據(jù)的PropertyChanged回調(diào)完成的。
數(shù)據(jù)綁定模式:
| 模式 | 描述 |
| OneWay | 源 → 目標(biāo) |
| TwoWay | 源 ←→ 目標(biāo) |
| OneWayToSource | 源 ← 目標(biāo) |
| OneTime | 源 → 目標(biāo) (僅一次) |
這可以通過 WPF 提供的不同類型的數(shù)據(jù)綁定表達(dá)式來實現(xiàn)。
下面給出了數(shù)據(jù)綁定表達(dá)式的類型。
- 數(shù)據(jù)上下文綁定
- 相對源綁定
- 集合綁定的當(dāng)前項目
數(shù)據(jù)上下文綁定
DataContext 是一個 Dependency 屬性,它是默認(rèn)的綁定源。數(shù)據(jù)上下文沿邏輯樹繼承。因此,如果您設(shè)置一個數(shù)據(jù)上下文來控制邏輯樹中的所有子元素,它也將引用相同的數(shù)據(jù)上下文,除非并且直到明確指定另一個源。
- 創(chuàng)建一個類Book,如下:
- 添加一個 XAML 文件 DataContextBinding.xaml 并放置四個 Textblock,如下所示。
現(xiàn)在,讓我們看看如何使用這個 DataContext 屬性來顯示數(shù)據(jù)。
它有兩種使用方式,如下所示。
用于直接綁定 DataContext。
創(chuàng)建類 Book 的實例,初始化其屬性并將類的 Name 屬性分配給 Window 的 DataContext 屬性。
由于 Datacontext 是沿邏輯樹和數(shù)據(jù)簿繼承的,因此 name 綁定到 Control Window。Window 的所有子元素也將引用同一個對象(book.Name)。
要顯示數(shù)據(jù),請將 DataContext 與 Textblock 綁定,如下所示。
<TextBlock Text="Book Name:" FontWeight="Bold"/> <TextBlock Text="{Binding}" Grid.Column="1" />綁定 Datacontext 的屬性。
創(chuàng)建一個 Book 類的實例,初始化它的屬性并將類(book)的實例分配給 Window 的 DataContext 屬性。
現(xiàn)在,讓我們看看輸出。
由于綁定表達(dá)式 {Binding} 用于綁定 Book 類型的 DataContext 對象,因此在其上調(diào)用 ToString() 方法并將數(shù)據(jù)顯示為字符串。為了以正確的格式顯示數(shù)據(jù),我們必須綁定屬性帶有文本塊的數(shù)據(jù)對象,如下圖所示:
<TextBlock Text="Book Name:" FontWeight="Bold"/> <TextBlock Text="{Binding Name}" Grid.Column="1" /> <TextBlock Text="Author:" FontWeight="Bold" Grid.Row="1" /> <TextBlock Text="{Binding Author}" Grid.Row="1" Grid.Column="1"/>綁定表達(dá)式{Binding Name}用于綁定DataContext綁定的Name屬性。
輸出
RelativeSource Binding
RelativeSource 是一個屬性,它設(shè)置綁定源與綁定目標(biāo)的相對關(guān)系。當(dāng)您必須將元素的一個屬性綁定到同一元素的另一個屬性時,主要使用此擴(kuò)展。
有四種類型的RelativeSource,如下所示。
讓我們一一詳細(xì)探討。
Self
Self用于一個場景,當(dāng)Binding源和綁定目標(biāo)相同時。對象的一個??屬性與同一對象的另一個屬性綁定。
例如 - 讓我們采用具有相同高度和寬度的橢圓。
在 XAML 文件中添加下面給出的代碼。寬度屬性與高度屬性相對綁定。
<Grid> <Ellipse Fill="Black" Height="100" Width="{Binding RelativeSource={RelativeSource Self},Path=Height}"> </Ellipse> </Grid>輸出
如果 Ellipse 的高度發(fā)生變化,寬度也會相對變化。
FindAncestor
顧名思義,這在綁定源是綁定目標(biāo)的祖先(父母)之一時使用。使用 FindAncestor 擴(kuò)展,您可以找到任何級別的祖先。
讓我們舉個例子來更清楚地理解它。
創(chuàng)建 XAML,它表示下面給出的元素的邏輯樹。
<Grid Name="Parent_3"> <StackPanel Name="Parent_2"> <Border Name="Parent_1"> <StackPanel x:Name="Parent_0" Orientation="Vertical"> <Button></Button> </StackPanel> </Border> </StackPanel> </Grid>現(xiàn)在,讓我們使用 FindAncestor 擴(kuò)展將祖先的名稱屬性綁定到子元素按鈕的內(nèi)容屬性。
<Grid Name="Parent_3"><StackPanel Name="Parent_2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="100"> <Border Name="Parent_1"> <StackPanel x:Name="Parent_0" Orientation="Vertical"> <Button Height="50" Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}, AncestorLevel=2},Path=Name}"></Button> </StackPanel> </Border> </StackPanel> </Grid>輸出
AncestorType “StackPanel” 結(jié)合 AcestorLevel as “2” 將 button 的 content 屬性與 StackPanel (Parent_2) 的 Name 屬性綁定。
TemplatedParent
TemplatedParent 是一個屬性,它使您能夠創(chuàng)建具有少量未知值的控件模板。這些值取決于應(yīng)用 ControlTemplate 的控件的屬性。
讓我們舉個例子來更詳細(xì)地理解它
- 為按鈕創(chuàng)建一個ControlTemplate,如下所示。
在上面給出的代碼中,Ellipse 的示例 Fill 屬性和 ContentPresenter 的 Content 屬性取決于將應(yīng)用此模板的控件的屬性值。
- 添加一個按鈕并將模板應(yīng)用到它。
在應(yīng)用模板時,按鈕的Background(Beige)與Ellipse的Fill屬性相對綁定,Content(點我)與ContentPresenter的Content屬性相對綁定。評估相關(guān)值并給出下面給出的輸出。
輸出:
PreviousData
這是RelativeSource 最少使用的模式。這在分析數(shù)據(jù)時出現(xiàn),我們需要表示相對于先前數(shù)據(jù)的值變化。
讓我們舉個例子來更詳細(xì)地理解它。
- 創(chuàng)建一個Data類并實現(xiàn)INotifyPropertyChanged接口,如下圖
- 創(chuàng)建一個列表以鍵入 Data 并將其分配為 DataContext。
- 在 XAML 文件中添加 ItemsControl。
- 為其創(chuàng)建 ItemsPanel 模板,如下所示。
- 現(xiàn)在,為了正確表示數(shù)據(jù),創(chuàng)建 DataTemplate,如下所示。
輸出
藍(lán)色框的高度是列表中項目的值,之前的數(shù)據(jù)顯示在框的右側(cè)。項目的第一個值為“60”。因此,先前的數(shù)據(jù)顯示第一項沒有價值。
總結(jié)
以上是生活随笔為你收集整理的WPF Binding绑定模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度地图定位API+和风天气城市搜索AP
- 下一篇: 记录一下自己的春招,唯品会、360、京东