欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Windows Presentation Foundation 數據綁定:第一部分
show toc
歡迎來(lái)到 MSDN >Windows 開(kāi)發(fā)
Windows Presentation Foundation 數據綁定:第一部分
發(fā)布日期: 2006-6-5 | 更新日期: 2006-6-5
適用于:
Microsoft Windows Presentation Foundation
摘要:本文闡釋如何使用基于 XAML 的數據綁定在 Microsoft Windows Presentation Foundation 項目中執行數據操作。
本頁(yè)內容
簡(jiǎn)介
簡(jiǎn)化的 XAML 綁定
我們所處的位置
參考資料
簡(jiǎn)介
Windows Presentation Foundation(以前稱(chēng)作 Avalon)為胖客戶(hù)端開(kāi)發(fā)用戶(hù)界面引入了一個(gè)意義深遠的新方法。WPF 第一次將用戶(hù)界面設計與代碼設計相分離。這種分離意味著(zhù),通常標記在一個(gè)文件中而代碼則在另一個(gè)文件中,這與 ASP.NET 很類(lèi)似。然而,這種分離僅在編譯時(shí)存在。標記文件用于生成形成代碼文件的代碼,進(jìn)而生成應用程序。
為了便于設計,Microsoft 開(kāi)發(fā)了一種豐富的標記語(yǔ)言,稱(chēng)作 XAML。XAML 是一種基于 XML 的標記語(yǔ)言,它支持一個(gè)用于開(kāi)發(fā)特定應用程序的新模型,這些應用程序具有對許多不同的用戶(hù)界面概念的本機支持,如 2D 和 3D 繪圖、動(dòng)畫(huà)、控件包容、控件和文檔流,以及一個(gè)豐富的數據綁定模型。本文將概述 WPF 數據綁定,并假定您對 WPF 有一定的了解。如果您還不了解 WPF,請參閱 Tim Sneath 的Architectural Overview of the Windows Presentation Foundation Beta 1 Release 一文進(jìn)行概覽。
為什么使用數據綁定?
如果您要開(kāi)始使用 WPF,可能想知道:不用學(xué)習數據綁定,只編寫(xiě)代碼來(lái)執行項目中的大部分數據操作是否更容易。雖然這可能是一個(gè)有效的方法,但我猜想您將逐漸使用基于 XAML 的數據綁定,甚至可能會(huì )愛(ài)上它。下面我們來(lái)看一個(gè)小示例。
圖 1 顯示一個(gè)簡(jiǎn)單 WPF 項目的用戶(hù)界面。它是 RSS 提要的編輯器,允許用戶(hù)查看和編輯提要。
圖 1. 我們的 RSS 編輯器
該編輯器的布局相當簡(jiǎn)單,如以下 XAML 代碼所示。
<Window x:Class="ExampleCS.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ExampleCS" Loaded="Window1_Loaded" > <StackPanel> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> BlogEditor </TextBlock> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <ListBox Name="entryListBox" Height="300" SelectionChanged="entryListBox_Changed"/> <Grid Width="500" Margin="5"> <Grid.ColumnDefinitions> <ColumnDefinition Width="50" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="*" /> <RowDefinition Height="25" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0">Title:</TextBlock> <TextBox Grid.Row="0" Grid.Column="1" Name="titleText" /> <TextBlock Grid.Row="1" Grid.Column="0">Url:</TextBlock> <TextBox Grid.Row="1" Grid.Column="1" Name="urlText" /> <TextBlock Grid.Row="2" Grid.Column="0">Date:</TextBlock> <TextBox Grid.Row="2" Grid.Column="1" Name="dateText" /> <TextBlock Grid.Row="3" Grid.Column="0">Body:</TextBlock> <TextBox Grid.Row="3" Grid.Column="1" Name="bodyText" TextWrapping="Wrap" /> <Button Grid.Row="4" Grid.ColumnSpan="2" Grid.Column="1" Click="updateButton_Click"> Update </Button> </Grid> </StackPanel> </StackPanel> </Window>
請注意加粗顯示的事件處理程序。那里是大部分代碼將發(fā)生的地方,加載 RSS 提要并填充 WPF 控件。
C#:
XMLDocument blog = new XMLDocument(); const string BLOGURL = @"z:\adoguy.RSS"; public Window1() { InitializeComponent(); blog.Load(BLOGURL); } void Window1_Loaded(object sender, RoutedEventArgs e) { FillListBox(); } void FillListBox() { entryListBox.Items.Clear(); XMLNodeList nodes = blog.SelectNodes("http://item"); foreach (XMLNode node in nodes) { ListBoxItem item = new ListBoxItem(); item.Tag = node; item.Content = node["title"].InnerText; entryListBox.Items.Add(item); } }
Visual Basic .NET:
Dim blog As New XMLDocument Const BLOGURL As String = "z:\adoguy.RSS" Public Sub New() InitializeComponent() blog.Load(BLOGURL) End Sub Sub Window1_Loaded(ByVal sender As Object, _ ByVal e As RoutedEventArgs) FillListBox() End Sub Sub FillListBox() entryListBox.Items.Clear() Dim nodes As XMLNodeList = blog.SelectNodes("http://item") For Each node As XMLNode In nodes Dim item As New ListBoxItem item.Tag = node item.Content = node("title").InnerText entryListBox.Items.Add(item) Next End Sub
在這段代碼中,您可以看到:我們用 RSS 提要加載一個(gè) XML 文檔,用所有項的標題填充 ListBox。
接下來(lái),我們需要處理在 ListBox 中進(jìn)行選擇時(shí)將發(fā)生的事情。
C#:
void entryListBox_Changed(object sender, RoutedEventArgs e) { if (entryListBox.SelectedIndex != -1) { XMLNode node = ((ListBoxItem)entryListBox.SelectedItem).Tag as XMLNode; if (node != null) { titleText.Text = node["title"].InnerText; URLText.Text = node["guid"].InnerText; dateText.Text = node["pubDate"].InnerText; bodyText.Text = node["description"].InnerText; } } }
Visual Basic .NET:
Sub entryListBox_Changed(ByVal sender As Object, _ ByVal e As SelectionChangedEventArgs) If entryListBox.SelectedIndex <> -1 Then Dim node As XMLNode = CType(entryListBox.SelectedItem, ListBoxItem).Tag If Not node Is Nothing Then titleText.Text = node("title").InnerText URLText.Text = node("guid").InnerText dateText.Text = node("pubDate").InnerText bodyText.Text = node("description").InnerText End If End If End Sub
當 ListBox 更改時(shí),我們用所選的 RSS 提要項填充 TextBoxes??梢酝ㄟ^(guò)獲取提要項的內部文本來(lái)執行該操作。請注意,我們還需要用 ListBoxItem, 保留節點(diǎn)的一份副本,進(jìn)行一些轉換以到達每個(gè)事件處理程序。
最后,我們需要處理單擊 Update 按鈕時(shí)發(fā)生的事情。
C#:
void updateButton_Click(object sender, RoutedEventArgs e) { if (entryListBox.SelectedIndex != -1) { XMLNode node = ((ListBoxItem)entryListBox.SelectedItem).Tag as XMLNode; if (node != null) { node["title"].InnerText = titleText.Text; node["guid"].InnerText = URLText.Text; node["pubDate"].InnerText = dateText.Text; node["description"].InnerText = bodyText.Text; blog.Save(BLOGURL); FillListBox(); } } }
Visual Basic .NET:
Sub updateButton_Click(ByVal sender As Object, _ ByVal e As RoutedEventArgs) If entryListBox.SelectedIndex <> -1 Then Dim node As XMLNode = CType(entryListBox.SelectedItem, ListBoxItem).Tag If Not node Is Nothing Then node("title").InnerText = titleText.Text node("guid").InnerText = URLText.Text node("pubDate").InnerText = dateText.Text node("description").InnerText = bodyText.Text blog.Save(BLOGURL) FillListBox() End If End If End Sub
在此處,假如更改了標題,我們用新信息更新節點(diǎn),保存 XML 文檔,并導致重新填充 ListBox。盡管這只是一個(gè)簡(jiǎn)單的小應用程序,但需要的代碼還是有點(diǎn)兒多。使用 XAML 數據綁定執行該操作是否會(huì )簡(jiǎn)單些?是的,會(huì )更簡(jiǎn)單。以下是同一個(gè)項目的 XAML,使用 XAML 數據綁定。
<StackPanel.Resources> <b><XMLDataProvider x:Key="RSSFeed" Source="z:\adoguy.RSS" /></b> </StackPanel.Resources> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> Blog Editor </TextBlock> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <ListBox Name="entryListBox" Height="300" <b>ItemsSource="{Binding Source={StaticResource RSSFeed}, XPath=//item}"</b> > <ListBox.ItemTemplate> <DataTemplate> <TextBlock <b>Text="{Binding XPath=title}"</b> /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Grid Width="500" Margin="5" <b>DataContext="{Binding ElementName=entryListBox, Path=SelectedItem}"</b> > <Grid.ColumnDefinitions> <ColumnDefinition Width="50" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="25" /> <RowDefinition Height="*" /> <RowDefinition Height="25" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0">Title:</TextBlock> <TextBox Grid.Row="0" Grid.Column="1" Name="titleText" <b>Text="{Binding XPath=title}"</b> /> <TextBlock Grid.Row="1" Grid.Column="0">URL:</TextBlock> <TextBox Grid.Row="1" Grid.Column="1" Name="URLText" <b> Text="{Binding XPath=guid}"</b> /> <TextBlock Grid.Row="2" Grid.Column="0">Date:</TextBlock> <TextBox Grid.Row="2" Grid.Column="1" Name="dateText" <b>Text="{Binding XPath=pubDate}"</b> /> <TextBlock Grid.Row="3" Grid.Column="0">Body:</TextBlock> <TextBox Grid.Row="3" Grid.Column="1" Name="bodyText" TextWrapping="Wrap" <b>Text="{Binding XPath=description}"</b> /> <Button Grid.Row="4" Grid.ColumnSpan="2" Grid.Column="1" > Update </Button> </Grid> </StackPanel> </StackPanel>
這段 XAML 代碼運行時(shí)沒(méi)有任何隱藏的代碼。圖 2 顯示只使用 XAML 的應用程序(使用 XAMLPad)。
圖 2. XAMLPad 中的 RSS 編輯器
您可能想知道"它是如何運行的"?它之所以運行,是因為我們使用 XAML 綁定來(lái)為我們做大量的工作。雖然以后會(huì )詳細介紹 XAML 中涉及的每項技術(shù),但我們還是先瀏覽一下數據綁定的各部分內容,從而解釋它在實(shí)際工作中的情況。
首先,創(chuàng )建一個(gè) XMLDataProvider 對象來(lái)加載和管理編輯器的 XML 文檔。
<XmlDataProvider x:Key="RssFeed" Source="z:\adoguy.RSS" />
它告訴 XAML 從 Z: 驅動(dòng)器加載一個(gè) XML 文檔,以填充窗體。
接下來(lái),綁定 ListBox。
<ListBox Name="entryListBox" Height="300" ItemsSource="{Binding Source={StaticResource RssFeed}, XPath=//item}" >
這段代碼告訴列表框查找名為 RSSFeed 的 XAML 中的資源,然后將其用作數據源。此外,它還告訴列表框從 XPath 表達式獲得要綁定到的項的列表(在本例中是文檔中的所有項元素)。
接下來(lái),通過(guò)指定數據模板來(lái)指定要在列表框的各項中顯示的內容。
<DataTemplate> <TextBlock Text="{Binding XPath=title}" /> </DataTemplate>
這段代碼告訴 ListBox 為每項創(chuàng )建一個(gè) TextBlock 對象,并使用 XPath 確定要在 TextBlock 中顯示的內容。
接下來(lái),綁定包含所有詳細信息的網(wǎng)格。
<Grid Width="500" Margin="5" DataContext="{Binding ElementName=entryListBox, Path=SelectedItem}" >
在此處,我們告訴 XAML 將容器(在本例中是 Grid)綁定到 ListBox 的選定項。我們使用 ElementName 而不是 Source,因為我們希望綁定到 XAML 文檔中的某個(gè)控件,而不是一些外部數據。通過(guò)設置 DataContext,允許將 Grid 中的所有控件設置為同一個(gè)對象(在本例中是 SelectedItem)。
接下來(lái),我們將每個(gè) TextBox 綁定到所需的 XML 文檔部分。
<TextBlock Grid.Row="0" Grid.Column="0">Title:</TextBlock> <TextBox Grid.Row="0" Grid.Column="1" Name="titleText" Text="{Binding XPath=title}" /> <TextBlock Grid.Row="1" Grid.Column="0">Url:</TextBlock> <TextBox Grid.Row="1" Grid.Column="1" Name="urlText" Text="{Binding XPath=guid}" /> <TextBlock Grid.Row="2" Grid.Column="0">Date:</TextBlock> <TextBox Grid.Row="2" Grid.Column="1" Name="dateText" Text="{Binding XPath=pubDate}" /> <TextBlock Grid.Row="3" Grid.Column="0">Body:</TextBlock> <TextBox Grid.Row="3" Grid.Column="1" Name="bodyText" TextWrapping="Wrap" Text="{Binding XPath=description}" />
由于我們設置了 DataContext,因此可以?xún)H指定 XPath 表達式,以獲得我們需要的 RSS 提要的部分。
一下嘗試接受這些內容太多了。停下來(lái)喘口氣。我并不指望你們一下子都能接受。在下面部分中,我將前面示例的許多觀(guān)點(diǎn)分成各個(gè)更易于管理的部分。
返回頁(yè)首
簡(jiǎn)化的 XAML 綁定
要從一個(gè)有關(guān) Binding 對象如何工作的簡(jiǎn)單示例開(kāi)始,我們先從下面這個(gè)非常簡(jiǎn)單的 XAML 文檔入手。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" > <Canvas> <TextBox Text="This is a TextBox" /> <TextBlock Canvas.Top="25" >Test</TextBlock> </Canvas> </Window>
這段代碼創(chuàng )建了一個(gè)簡(jiǎn)單的畫(huà)布,包含兩個(gè)控件,如圖 3 所示。
圖 3. 簡(jiǎn)單的 XAML 畫(huà)布
我們可能希望綁定 TextBlock,以便按照鍵入的方式顯示 TextBox 的文本。為此,我們需要一個(gè) Binding 對象將兩個(gè)對象綁定在一起。首先要向 TextBox 添加一個(gè)名稱(chēng),這樣我們才能通過(guò)元素名引用元素。
<TextBox Name="theTextBox" />
接下來(lái),我們需要向 TextBlock 的 Text 元素添加一個(gè) Binding。
<TextBlock Canvas.Top="25"> <TextBlock.Text> <Binding ElementName="theTextBox" Path="Text" /> </TextBlock.Text> </TextBlock>
這段代碼告訴 TextBlock 的 Text 要設置為 TextBox 控件中的用戶(hù)類(lèi)型。
將以上這幾段代碼組合在一起即可產(chǎn)生以下代碼。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" > <Canvas> <TextBox Name="theTextBox" Text="Hello" /> <TextBlock Canvas.Top="25"> <TextBlock.Text> <Binding ElementName="theTextBox" Path="Text" /> </TextBlock.Text> </TextBlock> </Canvas> </Window>
這段 XAML 代碼創(chuàng )建了一個(gè)窗體,該窗體按照在 TextBox 中鍵入的內容更改 TextBlock,如圖 4 所示。
圖 4. 綁定控件
祝賀您!您已經(jīng)擁有了自己的第一個(gè)綁定!但是這個(gè) XML 語(yǔ)法有點(diǎn)冗長(cháng)。應該有更好的編寫(xiě)方法。
使用綁定簡(jiǎn)化版本
在上一示例中我們了解到,如何將 Binding 元素添加到屬性來(lái)創(chuàng )建數據綁定。在這個(gè)簡(jiǎn)單的示例中,以這種方式進(jìn)行數據綁定似乎不太麻煩;然而,隨著(zhù) XAML 文檔的增大,這個(gè)冗長(cháng)的語(yǔ)法可能會(huì )變得比較麻煩。為了緩解這個(gè)問(wèn)題,XAML 支持綁定語(yǔ)法的一個(gè)簡(jiǎn)化版本。
例如,使用簡(jiǎn)化版本,上一示例如下所示。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" > <Canvas> <TextBox Name="theTextBox" Text="Hello" /> <TextBlock Canvas.Top="25" Text="{Binding ElementName=theTextBox, Path=Text}" /> </Canvas> </Window>
簡(jiǎn)化語(yǔ)法包含在大括號 ({}) 中,以單詞 Binding 開(kāi)始,包含綁定屬性的名稱(chēng)/值對。簡(jiǎn)化語(yǔ)法的目的是使數據綁定需要更少的擊鍵,并且更易于閱讀。本文的剩余部分,我將使用簡(jiǎn)化語(yǔ)法。
綁定源
目前為止,我們已經(jīng)將另一個(gè)控件用作所有綁定示例的源。然而,在大多數基于 XAML 的項目中,您將綁定到除其他控件外的源。大多數數據綁定的關(guān)鍵是 Source 屬性。在前面的示例中,我們使用的是 ElementName 屬性(它用于綁定到一個(gè)控件),而不是使用 Source 屬性。對于大多數應用程序,您希望綁定到更重要的源,如 XML 或 .NET 對象。XAML 用其 provider 對象支持該操作。XAML 中內置有兩種類(lèi)型的數據提供程序:ObjectDataProvider 和 XMLDataProvider。ObjectDataProvider 用于綁定到 .NET 對象以及從 .NET 對象綁定,并不奇怪的是,XMLDataProvider 用于綁定到 XML 片段和文檔以及從 XML 片段和文檔進(jìn)行綁定。您可以在任何 XAML 容器的資源部分中指定一個(gè)數據提供程序。
使用 XMLDataProvider
例如:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <StackPanel.Resources> <XmlDataProvider x:Key="FavoriteColors"> <x:XData> <Colors xmlns=""> <Color>Blue</Color> <Color>Black</Color> <Color>Green</Color> <Color>Red</Color> </Colors> </x:XData> </XmlDataProvider> </StackPanel.Resources> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> XML Example </TextBlock> <ListBox Width="200" Height="300" ItemsSource="{Binding Source={StaticResource FavoriteColors}, XPath=/Colors/Color}"> </ListBox> </StackPanel>
在 StackPanel 的資源中,我們有一個(gè) XMLDataProvider 對象。x:Key 表示 Binding 對象中用來(lái)引用它的名稱(chēng)。在該提供程序中,我們創(chuàng )建了 XML 內聯(lián),用作數據綁定的源。在 ListBox 的 Binding 中,我們將提供程序指定為綁定的 Source。如果某個(gè)數據源位于 XAML 文檔中,您需要指定該對象是一個(gè)靜態(tài)源,如此處所示。最后,我們使用 XPath 語(yǔ)句指定應該使用 XML 文檔中的哪個(gè)集合來(lái)填充 ListBox。該代碼生成圖 5 所示的窗體。
圖 5. XML 數據綁定
或者,我們可以指定:該提供程序應該使用路徑或 URL 來(lái)查找用來(lái)創(chuàng )建相同窗體的 XML 的源,方法是指定 XMLDataProvider 的 Source 屬性。
<XmlDataProvider x:Key="FavoriteColors" Source="D:\Writing\msdn\avalondatabindingpt1\xaml\colors.xml" />
XMLDataProvider 的 Source 屬性也可以指向標準 URL,從而使您能夠創(chuàng )建到 XML API(如 RSS)的快速訪(fǎng)問(wèn)。
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <StackPanel.Resources> <XmlDataProvider x:Key="MyRSS" Source="http://adoguy.com/RSS" /> </StackPanel.Resources> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> XML Example </TextBlock> <ListBox Width="500" Height="300" ItemsSource="{Binding Source={StaticResource MyRSS}, XPath=//item/title}"> </ListBox> </StackPanel>
通過(guò)調出到一個(gè) RSS 提要,可以創(chuàng )建一個(gè)頁(yè)面,它在 ListBox 中快速列出我的網(wǎng)絡(luò )日記中的所有主題,如圖 6 所示。
圖 6. 我的網(wǎng)絡(luò )日記的主題列表
使用 ObjectDataProvider
有時(shí)需要到 .NET 對象的綁定。這就是引入 ObjectDataProvider 的地方。該數據提供程序使您能夠為 .NET 數據類(lèi)型創(chuàng )建綁定。
例如,我們可以在 .NET 中創(chuàng )建一個(gè)簡(jiǎn)單的字符串集合,如下所示。
public class MyStrings : List { public MyStrings() { this.Add("Hello"); this.Add("Goodbye"); this.Add("Heya"); this.Add("Cya"); } }
- 或者 -
Public Class MyStrings Inherits List(Of String) Public Sub New() Me.Add("Hello") Me.Add("Goodbye") Me.Add("Heya") Me.Add("Cya") End Sub End Class
也可以在 XAML 文檔中使用一條處理指令將 CLR 對象的整個(gè)命名空間添加到該文檔所支持的類(lèi)型中,方法是將該命名空間指定為一個(gè) xmlns 聲明。例如,我們可以將整個(gè)命名空間的類(lèi)映射到 XAML 中,如下所示。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Simple Source Binding" xmlns:local="clr-namespace:XamlExamples" x:Class="XamlExamples.SimpleSource" > <!-- ... --> </Window>
要從外部程序集導入類(lèi),可以指定一個(gè) xmlns 聲明,僅指定程序集名稱(chēng),如下所示。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Simple Source Binding" xmlns:sys="clr-namespace:System,assembly=mscorlib" x:Class="XamlExamples.SimpleSource" > <!-- ... --> </Window>
一旦已經(jīng)導入了類(lèi)型,就可以使用 ObjectDataProvider 指定來(lái)自其中一種類(lèi)型的數據源。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Simple Source Binding" xmlns:local="clr-namespace:XamlExamples" x:Class="XamlExamples.SimpleSource" > <Window.Resources> <ObjectDataProvider x:Key="MyStringData" ObjectType="{x:Type local:MyStrings}" /> </Window.Resources> <StackPanel> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> Simple Source Example </TextBlock> <ListBox Name="theListBox" Width="200" Height="300" ItemsSource="{Binding Source={StaticResource MyStringData}}"/> </StackPanel> </Window>
也可以通過(guò)要使用的命名空間和類(lèi)型指定一個(gè) XAML 元素,來(lái)創(chuàng )建資源,如下所示。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Simple Source Binding" xmlns:local="clr-namespace:XamlExamples" x:Class="XamlExamples.SimpleSource" > <Window.Resources> <local:MyStrings x:Key="MyStringData" /> </Window.Resources> <StackPanel> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> Simple Source Example </TextBlock> <ListBox Name="theListBox" Width="200" Height="300" ItemsSource="{Binding Source={StaticResource MyStringData}}"/> </StackPanel> </Window>
該語(yǔ)法的工作方式就像 ObjectDataSource 一樣,只不過(guò)更易于使用。既然已經(jīng)導入了命名空間,我們就可以添加一個(gè)引用我們的數據源類(lèi)的資源了,方法是指定該類(lèi)的名稱(chēng)(例如, MyStrings)。數據綁定與前面的示例相同,因為 XAML 代碼并不關(guān)心它是何種數據源,只要是數據源就可以了。
綁定模式
在大多數情況下,您希望綁定是一個(gè)雙向綁定。Binding 對象支持幾種模式以支持不同的用例,如表 1 所示。
表 1. 綁定模式
綁定模式 說(shuō)明
TwoWay
雙向移動(dòng)綁定控件或綁定源的改動(dòng)。(這是默認模式。)
OneWay
僅將改動(dòng)從源移動(dòng)到控件。當源發(fā)生改動(dòng)時(shí),綁定控件的數據也相應更改。
OneTime
數據僅在啟動(dòng)時(shí)綁定,第一次用數據填充控件后忽略對源的更改。
只需在標記中包括模式即可指定模式,如下所示。
{Binding ElementName=theTextBox, Path=Text, Mode=OneTime}
一種了解雙向綁定工作方式的方法是創(chuàng )建一個(gè)具有兩個(gè)文本框的Canvas,一個(gè)文本框綁定到另一個(gè)文本框。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" > <Canvas> <TextBox Name="theTextBox" Text="Hello" /> <TextBox Canvas.Top="25" Text="{Binding ElementName=theTextBox, Path=Text, Mode=TwoWay}" /> </Canvas> </Window>
如果將這段代碼粘貼到 SDK 附帶的 XAMLPad 工具中,您應該注意到,源文本框按照您鍵入的內容更新綁定的文本框,但是,從綁定控件到源控件的更新僅發(fā)生在綁定控件失去焦點(diǎn)時(shí)。如果將 Mode 更改為 OneWay 或 OneTime,就會(huì )看到這些不同的模式是如何更改綁定的工作方式的。
控制綁定時(shí)間
除了模式,您還可以使用UpdateSourceTrigger 指定綁定何時(shí)推出更改。您可以指定綁定僅在指定的時(shí)間進(jìn)行更改,方法是指定 UpdateSourceTrigger 類(lèi)型。
{Binding ElementName=theTextBox, Path=Text, UpdateSourceTrigger=LostFocus}
UpdateSourceTrigger 屬性指定何時(shí)用改動(dòng)更新源。這僅對 Mode=TwoWay 綁定(默認方式)有效。表 2 顯示 UpdateSourceTrigger 的有效值。
表 2. UpdateSourceTrigger 值
UpdateSourceTrigger 說(shuō)明
Explicit
源僅通過(guò)顯式調用 BindingExpression.UpdateSource 方法更新。
LostFocus
綁定控件失去焦點(diǎn)時(shí)更新源。
PropertyChanged
每次屬性更改時(shí)都將改動(dòng)更新到源。這是默認行為。
使用 DataContext
本文要介紹的最后一個(gè)概念是如何使用DataContext。DataContext 專(zhuān)門(mén)用于指定某個(gè)容器中的所有控件都將綁定到一個(gè)公共對象。
例如,以下是一個(gè)示例:我們有一個(gè) Canvas,它將顯示 XML 文檔中特定節點(diǎn)的值和文本。
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <StackPanel.Resources> <XmlDataProvider x:Key="FavoriteColors"> <Colors xmlns=""> <Color ID="1">Blue</Color> <Color ID="2">Black</Color> <Color ID="3">Green</Color> <Color ID="4">Red</Color> </Colors> </XmlDataProvider> </StackPanel.Resources> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> XML DataContext Example </TextBlock> <Canvas DataContext="{Binding Source={StaticResource FavoriteColors}, XPath=‘/Colors/Color[@ID=2]‘}"> <TextBlock Text="{Binding XPath=@ID}" /> <TextBlock Canvas.Top="25" Text="{Binding XPath=.}" /> </Canvas> </StackPanel>
通過(guò)將DataContext 設置為 XML 文檔(以及一個(gè)特定的 XPath 表達式),我們告訴 Canvas:其中所有不包含 Source 的控件都可以使用容器的 DataContext。這樣,只需指定 XPath 表達式就能綁定 TextBlock。請注意,每個(gè) TextBlock 中的 XPath 表達式都是相對的 XPath 表達式。這對于對象綁定也一樣。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Simple Source Binding" x:Class="XamlExamples.SimpleSource" > <Window.Resources> <ObjectDataProvider TypeName="XamlExamples.MyStrings, XamlExamples" x:Key="MyStringData" /> </Window.Resources> <StackPanel> <TextBlock HorizontalAlignment="Center" FontWeight="Bold"> Object DataContext Example </TextBlock> <Canvas DataContext="{Binding Source={StaticResource MyStringData}}"> <TextBlock Text="{Binding Path=Length}" /> <TextBlock Canvas.Top="25" Text="{Binding Path=Item[0]}" /> </Canvas> </StackPanel> </Window>
使用對象代替 XML 僅僅意味著(zhù)您將使用 Path 表達式代替 XPath 表達式。
返回頁(yè)首
我們所處的位置
我們已經(jīng)了解了在 XAML 中如何用 Binding 對象直接進(jìn)行數據綁定,既有簡(jiǎn)化版本又有普通版本。通過(guò)利用 XML 或對象數據提供程序,我們可以綁定到應用程序中不同類(lèi)型的對象。我們還看到如何使用 Binding 對象的 ElementName 語(yǔ)法綁定到其他控件。在本系列的下一部分中,我將向您介紹如何利用該信息并將其綁定到實(shí)際的數據庫數據,使用您自己的對象或 .NET 數據容器(例如,DataSources 和 DataSets)。
返回頁(yè)首
參考資料
Windows SDK (includes WinFX)
Programming the Windows Presentation Foundation,Chris Sells 和 Ian Griffiths
轉到原英文頁(yè)面
返回頁(yè)首
 適合打印機打印的版本
 通過(guò)電子郵件發(fā)送此頁(yè)面
個(gè)人信息中心 |MSDN中文速遞郵件 |聯(lián)系我們
©2007 Microsoft Corporation. 版權所有.  保留所有權利 |商標 |隱私權聲明
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
LINQ to XML數據綁定
背水一戰 Windows 10 (20)
WPF中的TreeView控件_銀光中國 Silverlight 資源 社區 論壇
WPF 數據綁定實(shí)例一
WPF開(kāi)發(fā)學(xué)生信息管理系統【W(wǎng)PF+Prism+MAH+WebApi】(一)
WPF中綁定XML數據源
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久