我在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转换为我的子类。 什么方式更好?
答案 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>();
}
}