0

我在 wpf 应用程序中使用 mvvm 模式。作为数据源,我有 XDocument。在 UI 中,我将控件绑定到此 XDocument 中的 XElements 和 XAttribute 的值。前任

<TextBox Text={Binding XElement[TitleNode].XElement[Title].Value} />

它允许我将数据放在唯一的位置 - 在 XDoc 中,并允许避免从自定义模型到 xml 的数据转换。

现在我需要用 IDataErrorInfo 扩展模型的功能来实现错误通知。所以我需要向 XElement 和 XAttribute .net 类添加接口。我有 2 个决定:1) xelement 和 xattribute 的模式适配器,它将具有接口 IDataErrorInfo 的实现以及 xelement\xattribute 值的 Value setter\getter。弱点 - 我需要为所有 UI 输入控件创建适配器对象并绑定到它。2) 创建子类,继承XElement\XAttribute,实现接口。Weekness - 我需要将所有 xelements 和 xattributes 转换为我的子类。什么方法更好?

4

1 回答 1

0

我猜最好的方法是继承 XElement/XAttribute 并添加你需要的接口。我创建了 2 个子类 XElementCustom 和 XAttributeCustom。在构造函数中,递归地重新创建了整个树这就是我的实现:

    /// <summary>
    /// Наследник XML с реализацией INotifyPropertyChanged
    /// </summary>
    public class XElementCustom : XElement, INotifyPropertyChanged, IDataErrorInfo, IDataErrorInfoValidating
    {
public XElementCustom(XElement sourceElement)
            :base(sourceElement.Name.LocalName)
        {

            if (sourceElement.Elements().Any())
            {
                foreach (var element in sourceElement.Elements())
                {
                    this.Add(new XElementCustom(element));
                }
            }
            else
            {
                this.Value = sourceElement.Value;
            }

            foreach (var attribute in sourceElement.Attributes())
            {
                this.Add(new XAttributeCustom(attribute));
            }

            _changedProperties = new List<string>();
        }
}
于 2015-12-14T14:02:53.173 回答