L2DBForm.xaml.cs源代码

此页面包含文件 L2DBForm.xaml.cs中 C# 源代码的内容和说明。 此文件中包含的 L2XDBForm 分部类可以分为三个逻辑部分:数据成员和 OnRemoveOnAddBook 按钮单击事件处理程序。

数据成员

使用两个私有数据成员来将该类与 L2DBForm.xaml中的窗口资源关联起来。

  • 命名空间变量 myBooks 初始化为 "http://www.mybooks.com"

  • 用下面的行将构造函数中的成员 bookList 初始化为 L2DBForm.xaml 中的 CDATA 字符串

    bookList = (XElement)((ObjectDataProvider)Resources["LoadedBooks"]).Data;
    

OnAddBook 事件处理程序

此方法包含以下三个语句:

  • 第一个条件语句用于输入验证。

  • 第二个语句根据用户在“添加新书籍”用户界面 (UI) 区域中输入的字符串值新建 XElement

  • 最后一个语句将此新书籍元素添加到 L2DBForm.xaml 中的数据提供程序。 因此,动态数据绑定将使用此新项自动更新 UI;无需额外的用户提供代码。

OnRemove 事件处理程序

OnRemove 处理程序比 OnAddBook 处理程序复杂得多,原因有两个。 首先,由于原始 XML 包含保留的空白,因此还必须与书籍条目一起移除匹配的换行符。 其次,为了方便起见,删除的项上的选择将重置为列表中的上一项。

但是,移除所选的图书项目这一核心任务仅由两条语句完成:

  • 首先,检索与列表框中当前所选项相关联的书籍元素:

    XElement selBook = (XElement)lbBooks.SelectedItem;
    
  • 然后,从数据提供程序中删除此元素:

    selBook.Remove();
    

同样,动态数据绑定可确保程序的 UI 自动更新。

示例:

代码

using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Xml;
using System.Xml.Linq;

namespace LinqToXmlDataBinding {
    /// <summary>
    /// Interaction logic for L2XDBForm.xaml
    /// </summary>

    public partial class L2XDBForm : System.Windows.Window
    {
        XNamespace mybooks = "http://www.mybooks.com";
        XElement bookList;

        public L2XDBForm()
        {
            InitializeComponent();
            bookList = (XElement)((ObjectDataProvider)Resources["LoadedBooks"]).Data;
        }

        void OnRemoveBook(object sender, EventArgs e)
        {
            int index = lbBooks.SelectedIndex;
            if (index < 0) return;

            XElement selBook = (XElement)lbBooks.SelectedItem;
            //Get next node before removing element.
            XNode nextNode = selBook.NextNode;
            selBook.Remove();

            //Remove any matching newline node.
            if (nextNode != null && nextNode.ToString().Trim().Equals(""))
            { nextNode.Remove(); }

            //Set selected item.
            if (lbBooks.Items.Count > 0)
            {  lbBooks.SelectedItem = lbBooks.Items[index > 0 ? index - 1 : 0]; }
        }

        void OnAddBook(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(tbAddID.Text) ||
                String.IsNullOrEmpty(tbAddValue.Text))
            {
                MessageBox.Show("Please supply both a Book ID and a Value!", "Entry Error!");
                return;
            }
            XElement newBook = new XElement(
                                mybooks + "book",
                                new XAttribute("id", tbAddID.Text),
                                tbAddValue.Text);
            bookList.Add("  ", newBook, "\r\n");
        }
    }
}

注释

有关这些处理程序的关联 XAML 源,请参阅 L2DBForm.xaml 源代码

另请参阅