前篇介紹了如何使用 XmlDataProvider
對 WPF 控制項作 data binding,
本文將示範如何存取控制項的 Data Binding 內容。 (資料來源 XML 及介面佈局 XAML 請參考前文)
有經驗的開發者應該記憶猶存,若欲取得 ListBox
中已選擇項目的名稱或值,
只要透過程式碼取得 SelectedItem
,再轉為字串即可,作法如下:
private void listBoxExtension_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBox1.Text = listBoxExtension.SelectedItem.ToString();
}
但在 WPF,結果卻非盡如人意…
由上圖所示,選擇項目經過 ToString()
函式處理後在 textBox1
顯示的字串居然是 “System.Xml.XmlElement
“。
這並不是原先預期的項目名稱,而是資料來源的類別,究竟問題出在哪裡?
解說
其實,data binding 後的控制項可以分為兩部分:VisualTree 及 DataTree。
對本次 ListBox
data binding 範例而言,VisualTree 的元素便是 ListItem
;
而 DataTree 的元素則為 XmlElement
。
以往於 WinForm 開發時,直接存取的是 VisualTree 的內容,故透過 ToString()
便可取得其字串值。
但在 WPF,控制項經 data binding 後 SelectedItem
回傳的卻是 DataTree 的內容;
因此,我們必須以處理 XMLElement
的方式來存取它,如以下程式碼:
private void listBoxExtension_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBox1.Text = ((XmlElement)listBoxExtension.SelectedItem).InnerXml;
}
如此,便成功地取得將已選取項目的值。
小結
本文示範了 WPF 控制項於 data binding 後的存取方式,已及 DataTree 及 VisualTree 之差異;
後文將介紹一個有系統的 ListBox
使用案例。
最後附上本次範例完整程式碼:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Xml;
namespace WPF_XML_Data_Binding_Demo
{
///
///
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void listBoxExtension_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBox1.Text = ((XmlElement)listBoxExtension.SelectedItem).InnerXml;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
}
private void listBoxCategory_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}