日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF Binding绑定模式

發布時間:2023/12/16 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,如下所示。
<Grid VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="40" /> <RowDefinition Height="40" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TextBlock Text="Book Name:" FontWeight="Bold" /> <TextBlock Grid.Column="1" /> <TextBlock Text="Author:" FontWeight="Bold" Grid.Row="1" /> <TextBlock Grid.Row="1" Grid.Column="1" /> </Grid>

現在,讓我們看看如何使用這個 DataContext 屬性來顯示數據。

它有兩種使用方式,如下所示。

  • 使用 {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 綁定,如下所示。

    <TextBlock Text="Book Name:" FontWeight="Bold"/> <TextBlock Text="{Binding}" Grid.Column="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() 方法并將數據顯示為字符串。為了以正確的格式顯示數據,我們必須綁定屬性帶有文本塊的數據對象,如下圖所示:

    <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"/>

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

    輸出

    RelativeSource Binding

    RelativeSource 是一個屬性,它設置綁定源與綁定目標的相對關系。當您必須將元素的一個屬性綁定到同一元素的另一個屬性時,主要使用此擴展。

    有四種類型的RelativeSource,如下所示。

  • Self
  • FindAncestor
  • TemplatedParent
  • PreviousData
  • 讓我們一一詳細探討。

    Self

    Self用于一個場景,當Binding源和綁定目標相同時。對象的一個??屬性與同一對象的另一個屬性綁定。

    例如 - 讓我們采用具有相同高度和寬度的橢圓。

    在 XAML 文件中添加下面給出的代碼。寬度屬性與高度屬性相對綁定。

    <Grid> <Ellipse Fill="Black" Height="100" Width="{Binding RelativeSource={RelativeSource Self},Path=Height}"> </Ellipse> </Grid>

    輸出

    如果 Ellipse 的高度發生變化,寬度也會相對變化。

    FindAncestor

    顧名思義,這在綁定源是綁定目標的祖先(父母)之一時使用。使用 FindAncestor 擴展,您可以找到任何級別的祖先。

    讓我們舉個例子來更清楚地理解它。

    創建 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>

    現在,讓我們使用 FindAncestor 擴展將祖先的名稱屬性綁定到子元素按鈕的內容屬性。

    <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” 結合 AcestorLevel as “2” 將 button 的 content 屬性與 StackPanel (Parent_2) 的 Name 屬性綁定。

    TemplatedParent

    TemplatedParent 是一個屬性,它使您能夠創建具有少量未知值的控件模板。這些值取決于應用 ControlTemplate 的控件的屬性。

    讓我們舉個例子來更詳細地理解它

    • 為按鈕創建一個ControlTemplate,如下所示。
    <Window.Resources><ControlTemplate x:Key="template"> <Canvas> <Ellipse Height="110" Width="155" Fill="Black"/> <Ellipse Height="100" Width="150" Fill="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}"> </Ellipse> <ContentPresenter Margin="35" Content="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Content}"/> </Canvas></ControlTemplate> </Window.Resources>

    在上面給出的代碼中,Ellipse 的示例 Fill 屬性和 ContentPresenter 的 Content 屬性取決于將應用此模板的控件的屬性值。

    • 添加一個按鈕并將模板應用到它。
    <Button Margin="50" Background="Beige" Template="{StaticResource template}" Height="0" Content="Click me" FontSize="22"> </Button>

    在應用模板時,按鈕的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 > data = new List < Data > (); data.Add(new Data() { DataValue = 60 }); data.Add(new Data() { DataValue = 100 }); data.Add(new Data() { DataValue = 120 }); this.DataContext = data; }
    • 在 XAML 文件中添加 ItemsControl。
    <ItemsControl ItemsSource="{Binding}"></ItemsControl>
    • 為其創建 ItemsPanel 模板,如下所示。
    <ItemsControl ItemsSource="{Binding}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Vertical" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl>
    • 現在,為了正確表示數據,創建 DataTemplate,如下所示。
    <ItemsControl.ItemTemplate><DataTemplate> <StackPanel Orientation="Horizontal"> <Grid Margin="30,20,0,0"> <Rectangle Width="80" Height="{Binding DataValue}" Fill="Blue" /> <TextBlock Foreground="White" Margin="35,0,0,0" Text="{Binding DataValue}"></TextBlock> </Grid> <TextBlock Margin="30,20,0,0" Text="Previous Data:"></TextBlock> <TextBlock VerticalAlignment="Center" Margin="5,20,0,0" Text="{Binding RelativeSource={RelativeSource PreviousData}, Path=DataValue}" /> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate>

    輸出

    藍色框的高度是列表中項目的值,之前的數據顯示在框的右側。項目的第一個值為“60”。因此,先前的數據顯示第一項沒有價值。

    總結

    以上是生活随笔為你收集整理的WPF Binding绑定模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。