Запрос Xpath для шаблона данных в списке, привязанном к коллекции ObservableCollection <XmlNode> - PullRequest
0 голосов
/ 15 января 2012

Итак, я играю с некоторыми асинхронными вещами в WPF и пытаюсь загрузить комбинированный список с некоторыми данными XML, которые я извлекаю из каналов переполнения стека, я получаю данные без проблем и вижу, что поле со спискомНаселение, но я не могу получить название поста.Я попробовал несколько вещей, но в том-то и дело, что я просто не слишком много работал с данными XML и не знаю, что я делаю.

Вот мой шаблон данных

<ComboBox.ItemTemplate>
  <DataTemplate>
    <Border Background="Azure" Margin="1" Height="24" Width="100">
      <Label Content="{Binding XPath=InnerXml/title}" />
    </Border>
  </DataTemplate>
</ComboBox.ItemTemplate>

Как вы видите, я пытаюсь получить "InnerXML / title" - это не работает, и я пробовал несколько других вещей.Вот где я заполняю список

private async Task LoadListAsync(string url, int sleep)
    {
        Task<XmlNodeList> task = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(sleep);
            return GetFeed(url);
        });

        Log("In LoadListAsync before await");

        var list = await task;
        foreach (XmlNode node in list)
        {
            List.Add(node);
        }

        Log("In LoadListAsync, after await"); 
    }

Как я уже сказал, я вижу, как проходит цикл foreach, и список заполняется - я знаю это, потому что я вижу границы из шаблона, я просто не могупохоже на крафт и XPath запрос для получения заголовков.

Кто-нибудь может помочь с этим?Каждый раз, когда я делал это в прошлом, я использовал источник данных XML (в смеси не меньше), а не ObserverableCollection, это как-то связано с этим?

Спасибо.

Вот структура XML - я вижу ее в текстовом поле, к которому привязан SelectedXml.

<id xmlns=\"http://www.w3.org/2005/Atom\">http://stackoverflow.com/q/8872600</id><re:rank scheme=\"http://stackoverflow.com\" xmlns:re=\"http://purl.org/atompub/rank/1.0\">0</re:rank><title type=\"text\" xmlns=\"http://www.w3.org/2005/Atom\">
Which is faster to use binding using converter or update in a property changed callback?</title>
<category scheme=\"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags\" term=\"wpf\" xmlns=\"http://www.w3.org/2005/Atom\" />
<category scheme=\"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags\" term=\"binding\" xmlns=\"http://www.w3.org/2005/Atom\" />
<category scheme=\"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags\" term=\"delegates\" xmlns=\"http://www.w3.org/2005/Atom\" />
<category scheme=\"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags\" term=\"callback\" xmlns=\"http://www.w3.org/2005/Atom\" />
<category scheme=\"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags\" term=\"propertychanged\" xmlns=\"http://www.w3.org/2005/Atom\" />
<author xmlns=\"http://www.w3.org/2005/Atom\"><name>mihajlv</name><uri>http://stackoverflow.com/users/906042</uri></author>
<link rel=\"alternate\" href=\"http://stackoverflow.com/questions/8872600/which-is-faster-to-use-binding-using-converter-or-update-in-a-property-changed-c\" 
xmlns=\"http://www.w3.org/2005/Atom\" />
<published xmlns=\"http://www.w3.org/2005/Atom\">2012-01-15T19:23:34Z</published>
<updated xmlns=\"http://www.w3.org/2005/Atom\">2012-01-15T19:23:34Z</updated>
<summary type=\"html\" xmlns=\"http://www.w3.org/2005/Atom\">\r\n            &lt;p&gt;I need fast updates, so I was wondering which one is faster and more efficient.&lt;/p&gt;\n\r\n        </summary>

Ответы [ 2 ]

0 голосов
/ 16 января 2012

А-а-а ... Я связываюсь с ObservableCollecion, конечно, я не могу использовать в нем запрос XPath, поскольку WPF касается его объекта так же, как если бы я был связан с коллекцией людей или предметовили что-то еще.

Мне нужно было создать конвертер, я не привязывался к XML, я привязывался к XmlNode, который является объектом.Вот конвертер.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var node = (XmlNode)value;
         if (node["title"].InnerText == null)
                return "(no title)";
            return node["title"].InnerText;
    }

Вот правильная привязка.

<Label Content="{Binding Converter={StaticResource XmlNodeToTitleStringConverter}}" />
0 голосов
/ 15 января 2012

InnerXml является мета-свойством узлов XML, к нему нельзя обращаться с помощью XPath, если у узла есть непосредственный дочерний элемент title, тогда достаточно XPath=atom:title.

Обратите внимание, чтодолжно быть отображение пространства имен ( без XmlDataProvider ), и хотя пространство имен атома установлено как пространство имен по умолчанию, запрос XPath должен квалифицировать элементы.

Конкретный пример:

//Contains all 'entry' nodes.
private readonly ObservableCollection<XmlNode> _XmlData = new ObservableCollection<XmlNode>();
public ObservableCollection<XmlNode> XmlData { get { return _XmlData; } }
<ComboBox ItemsSource="{Binding XmlData}">
    <Binding.XmlNamespaceManager>
        <XmlNamespaceMappingCollection>
            <XmlNamespaceMapping Prefix="atom" Uri="http://www.w3.org/2005/Atom" />
        </XmlNamespaceMappingCollection>
    </Binding.XmlNamespaceManager>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding XPath=atom:title}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...