WPF,XML数据绑定到依赖/级联combobox
我有一个XML文件,具有以下结构:
...more SubComponent nodes... ...more Component nodes... ...more Product nodes...
我正在尝试创建一个WPF应用程序,其中包含带有产品名称的ComboBox。 我是WPF的新手,所以我不知道我是不是以正确的方式做事。 选择产品时,应使用该产品的所有组件填充第二个ComboBox。 选择Component时,应该使用该Component的所有SubComponents填充第三个ComboBox。
我不知道如何在ComboBox之间建立依赖关系,除了在独立的ComboBox触发的事件处理程序中填充依赖的ComboBox。 这似乎暗示我需要能够在C#中读取XML,因此我有[Serializable]
类用于Products
, Product
, Component
和SubComponent
。 但是,我试图在我的XAML中进行XML数据绑定:
我目前没有在我的第一个ComboBox中看到产品名称列表,其XAML如下:
Products XML应该是只读的 – 用户将无法从应用程序更改XML中的任何值。 我只想阅读XML数据并在应用程序中显示它。
我有几个问题:
- 我正确地谈到这个吗? 拥有我的WPF应用程序读取的独立XML文件,具有
[Serializable]
类,表示XML文件中的节点,以便从C#中的那些节点提取数据,使用事件处理程序编写ComboBox之间的依赖关系等。 - 为什么我的产品名称(例如MyProduct1)不会显示在我的ComboBox中? 目前它只显示为空。
- 看起来几乎像用于表示我的XML节点的
[Serializable]
类是冗余/不必要的,因为XAML已经有了XmlDataProvider
/ XPath的东西。 是这样的吗?
编辑:
将我的ComboBox XAML更新为以下内容,现在我在ComboBox中看到了产品名称列表,感谢decyclone的回答 :
ItemsSource
属性应设置为要在列表中显示的项的集合,在您的情况下是XmlDataProvider
。 用户StaticResource
定位它,因为它被定义为资源。 应使用DisplayMemberPath
属性来选择应使用哪个属性来显示combobox中的文本。
关于你的第一个(和3个)问题,我个人喜欢创建类而不是使用原始XML。 它给我带来的好处很少
-
添加包装器属性。 例如,FullName = FirstName +“”+ LastName属性。
-
每次我想访问值(总是字符串)时,我不必检查空值和类型安全性。
-
我可以添加自己的行为作为方法,这对于完成小任务非常有用。
-
控制序列化方法并使用属性在其中注入自定义逻辑。
关键是,值得吗? 你真的关心这些好处吗? 这就像在DataReader和DataSet之间进行选择一样。 对于readonly和displaylyly目的,使用原始XML,如果你打算玩它很多,使用类。
好的,既然我找到了一个更具体问题的答案,我想我也知道这个问题的答案。 我不需要[Serializable]
类用于我的XML中的不同节点,因为我可以使用XAML和XPath来创建级联/依赖的ComboBoxes: