Как привязать элемент управления к элементу XmlDocument в ViewModel (шаблон MVVM)? - PullRequest
0 голосов
/ 22 января 2011

Я пытаюсь связать TextBlock с элементом документа XML, он работает нормально, если источником является StaticResouce, но я не могу понять синтаксис для привязки к тому же документу XML, когдавыставляется через ViewModel.

Вот документ XML:

<Books>
    <Book ID="1" Name="ABC" />
    <Book ID="2" Name="DEF" />
    <Book ID="3" Name="XYZ" />
</Books>

Привязка к StaticResource = SUCCESSFUL

Файл ресурсов содержит XmlDataProvider со ссылкой на Books.xml:

<XmlDataProvider x:Key="data" Source="Books.xml"/>

А вот как я привязываюсь к файлу xml.

<TextBlock Text="{Binding Source={StaticResource data},XPath=/Books/Book/@Name}"/>
<XmlDataProvider x:Key="data" Source="../Views/Data.xml" />

Как я уже говорил, привязка выше работает нормально и отображает «ABC».Однако этот XmlDocument должен исходить от SQL Server и показываться через ViewModel (шаблон MVVM).

Привязка к ViewModel = FAILED

Свойство Books из ViewModel заполняется точно таким же XML (см. Выше):

public XmlDocument Books { get; set; }

И вот синтаксис, который я использую для привязки к ViewModel:

<TextBlock Text="{Binding Books,XPath=/Books/Book/@Name}" />

Он ничего не возвращает, и я получаю следующее сообщение об ошибке:

BindingExpression withXPath не может привязываться к объекту, отличному от XML.

Любая помощь приветствуется.

Ответы [ 4 ]

1 голос
/ 25 января 2011

Я нашел ответ на другой доске обсуждений. Вот как можно привязать элемент управления к свойству XMLDocument в ViewModel.

<TextBlock DataContext="{Binding Books}" Text="{Binding XPath=/Books/Book/@Name}"/>

Теперь я могу успешно связываться с результатами XML, поступающими с SQL Server. Надеюсь, что помочь другим с подобной проблемой. Приветствия.

1 голос
/ 22 января 2011

ColinE полностью ответил на вопрос.Но другое решение состоит в том, чтобы выставить свойство BookName.

public class ViewModel
{
    public ViewModel(XDocument doc)
    {
        this.Document = doc;
    }

    private XDocument Document
    {
        get;
        set;
    }

    public string BookName
    {
        get
        {
            return this.Document
                       .Element("Books")
                       .Element("Book")
                       .Attribute("Name").Value;
        }
    }

Тогда вам следует привязать непосредственно к свойству Name:

<TextBlock Text="{Binding BookName}" />
1 голос
/ 22 января 2011

В вашем примере, где вы привязываетесь к StaticResource, ваш путь привязки указывает на XmlDataProvider, который «адаптирует» ваш XmlDocument.Принимая во внимание, что в вашем примере ViewModel ваш путь - это сам XmlDocument.Чтобы добиться эквивалентной привязки из вашей ViewModel, свойство должно предоставлять XmlDataProvider.

0 голосов
/ 22 января 2011

Если вы привязаны к источнику в коде позади, вам не нужно использовать XPath.Простой путь подойдет.

Кодовый код

this.DataContext = Books;

Xaml

<TextBlock Text="{Binding Path=Name}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...