WPF 中以 XML 為資料來源的 Data Binding (2)

前篇介紹了如何使用 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
{
///

/// Interaction logic for Window1.xaml
///

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)
{
}
}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *