重新定义XElement,XAttribute + IDataErrorInfo以便在wpf app

时间:2015-12-11 15:50:23

标签: mvvm binding xelement idataerrorinfo xattribute

我在wpf app中使用mvvm模式。作为数据源我是XDocument。在UI中,我将控件绑定到此XDocument中的XElements和XAttribute的值。 f.ex.

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

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

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

1 个答案:

答案 0 :(得分: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>();
        }
}