【问题标题】:WPF advice on XML data binding: XmlDataPresenter vs custom class?WPF 关于 XML 数据绑定的建议:XmlDataPresenter 与自定义类?
【发布时间】:2010-01-20 22:57:36
【问题描述】:

我刚刚开始使用 WPF,我正在构建一个简单的电影库作为测试项目来帮助我找到自己的脚。

我将我的电影信息存储在 XML 中,例如:

  <movie id="1" title="Back To The Future" date="1985" ... />

电影出现在列表中,点击后字段将变为可编辑。我已经通过使用两个数据模板来设置列表项的样式,通过 ListBoxItem.IsSelected 属性上的触发器应用来实现这一点。

但对于绑定和编辑数据,我非常感谢您提供一些建议。我已经尝试了以下每种方法,并取得了不同程度的成功。你认为哪个最有意义?还有什么我可以尝试的吗?

方法 1:使用 XAML 中的 XMLDataProvider 直接绑定到 XML。在这种情况下,ListBox 绑定到 XmlDataProvider,并且各个控件元素通过 XPath 表达式绑定。上手非常简单,但是这种方法在编辑数据时似乎变得棘手。我们需要相当多的 ValueConverter 来确保数据以合理的方式呈现并以适当的格式保存回 XML 文件。

方法 2:创建一个自定义 Movie 类,该类接收 XML 并将所有电影属性公开为控件绑定到的公共属性。这感觉更健壮和灵活,但似乎需要更多的工作来实现。每个属性都需要在代码中显式公开,验证很麻烦。

方法 3:有点像方法 2,但使用电影用户控件而不是 ListBox + 数据模板。我从这个开始并很快放弃了它,因为我看不到方法 2 有任何优势。

我意识到这不是一个直截了当的问题,需要考虑很多因素,但对于各种利弊(或我是否遗漏任何技巧)的任何想法将不胜感激。如果您需要更多信息或代码示例,请告诉我。如果这个问题不恰当或不受欢迎,我们深表歉意。

非常感谢。

【问题讨论】:

    标签: c# .net wpf xml data-binding


    【解决方案1】:

    如果只是为了显示,不管你是否使用模板,方法一更有效,因为 wpf 引擎直接与 xml 一起工作。

    如果您要对数据进行编辑操作,最好使用方法二,因为您可以灵活地更好地操作数据。使用一个类,您可以执行与使用绑定的方法一完全相同的事情,因为引擎将从对象中读取,就像 xml 文件一样。这种方法可以轻松地以两种方式绑定元素,如果它来自 IObservable 集合,您可以覆盖在数据更改时调用的方法,因此它会更新 xml。

    【讨论】:

    • 非常感谢您的建议。我确实在方法 2 中将 ObservableCollection 绑定到 ListBox。你能解释一下重写数据更改时调用的方法是什么意思吗?我计划在 Movie 类的公共属性的 set 访问器中更新内存中的 xml,但我认为您可能指的是其他东西,这听起来很有趣!再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多