4

我正在探索 WPF 世界,我在网上找到了一个关于如何在 xml 上使用绑定的好例子

http://www.codeproject.com/Articles/37854/How-to-Perform-WPF-Data-Binding-Using-LINQ-to-XML

现在我试图扩展这个例子:我想在XElementUI 和 UI 之间创建一个“中间类”,并将所有 togheder 绑定在一个链中,所以,如果我对 xml 进行了修改,那么我有中间的属性类更新了,然后 UI 也更新了。

这里有一些代码:

这是包装的类XElement

public class XElementDataProvider : ObjectDataProvider
{
    public XElementDataProvider()
    {
        ObjectInstance = XElement.Load(@"C:\MyFile.xml");
    }

    private static XElementDataProvider instance;


    public static XElementDataProvider Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new XElementDataProvider();
            }
            return instance;
        }

    }
}

这是MiddleClass

public class MiddleClass : DependencyObject
{


    XElementDataProvider xElementDataProvider;
    XElement myxml;

    public MiddleClass()
    {
                    //here i get my dataprovider
        xElementDataProvider = XElementDataProvider.Instance;
        myxml = xElementDataProvider.Data as XElement;

                    //i bind my internal collection to the Elements...
        Binding binding = new Binding("Elements[book]")
        {
            Source = myxml,
            Mode = BindingMode.Default//here i cant use TwoWay, give me          //back an exeption
        };


        BindingOperations.SetBinding(this, XBookListProperty, binding);

                    //just to have confirmation of the adding
        myxml.Changed += new EventHandler<XObjectChangeEventArgs (myxml_Changed);

    }

    void myxml_Changed(object sender, XObjectChangeEventArgs e)
    {

    }

            //i use a DependencyProperty to have also a change callback
    public static readonly DependencyProperty XBookListProperty =
        DependencyProperty.Register("XBookList", typeof(IEnumerable),
        typeof(MiddleClass),
        new PropertyMetadata(XBookPropertyChanged)
        );


            //here i have a notification only at start but no when i add a new book
    private static void XBookPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MiddleClass middleClass = d as MiddleClass;
        middleClass.XBookPropertyChanged((IEnumerable)e.OldValue, (IEnumerable)e.NewValue);
    }

    private void XBookPropertyChanged(IEnumerable old, IEnumerable newValue)
    {

    }
             //this is the propery i finally want to expose to the UI but im not able //to keep updated
    public List<Book> bookList;
    public List<Book> BookList
    {
        get
        {
            return bookList;
        }
        set
        {
            bookList = value;
        }
    }



    //this is my internal list binded to the xml
    private IEnumerable XBookList
    {
        get
        {
            return (IEnumerable)GetValue(XBookListProperty);
        }
        set
        {
            SetValue(XBookListProperty, value);
        }
    }

            //here i try to add a book addind direcly to the xml//i expect a //notification of propery changed...but nothing
    public bool AddBook(string name)
    {

        XElement newWorkSheet = new XElement("Book",
            new XAttribute("Name", name)
            );

        myxml.Add(newWorkSheet);


        return true;
    }

Book 是一个代表一本书的类,假设它现在只有一个名称属性。

UI 类未命中,但它应该绑定在公共List<Book>BookList 上并以ListBox

Enyone 知道为什么我没有收到任何通知......或者我必须做些什么来保持公共List<Book>BookList 与私有同步IEnumerable<XBookList>

4

1 回答 1

0

好的,经过多次尝试,我找到的唯一解决方案是这个:

要在发生某些更改时收到通知,IEnumerable<XBookList>您需要在修改后清除它并重新绑定。

通过这种方式,您有一个关于清除的第一个未使用的通知,然后是关于新集合的另一个通知。

然后在处理程序中,您可以将新列表与旧列表同步。

public bool AddBook(string name)
{

    XElement newWorkSheet = new XElement("Book",
        new XAttribute("Name", name)
        );

    myxml.Add(newWorkSheet);


    ClearValue(XBookListProperty);
Binding binding = new Binding("Elements[book]")
    {
        Source = myxml,
        Mode = BindingMode.Default          
    };
    BindingOperations.SetBinding(this, XBookListProperty, binding);
    return true;
}
于 2012-10-24T11:55:50.777 回答