Использование атрибутов XML в качестве источника списка в WPF - PullRequest
0 голосов
/ 31 октября 2011

Мне нужно иметь возможность использовать ряд атрибутов в качестве источника в представлении списка WPF. В настоящее время я застрял на том, как это сделать. Я знаю, как сделать это для узлов XML, но не для атрибутов. Вот пример того, что я тоже пытаюсь связать:

<Stats HP="55000" MP="2500" SP="2500" Strength="212" Vitality="125" Magic="200" Spirit="162" Skill="111" Speed="109" Evasion="100" MgEvasion="100" Accuracy="100" Luck="55" />

Я хочу, чтобы каждое имя / значение статистики было записью в просмотре списка. Вот код, который я пытался заставить работать:

<TabControl.DataContext>
     <Binding ElementName="EnemyLevelsListBox" Path="SelectedItem"/>
</TabControl.DataContext>
<TabItem Header="Stats" Name="EnemyStatsTab">
      <ListView ItemsSource="{Binding XPath=Stats}" Height="310" Name="EnemyStatViewDisplay" Width="411" HorizontalAlignment="Left">
      <ListView.ItemTemplate>
            <DataTemplate>
                  <TextBlock Text="{Binding Path=Attribute.Name}" />
                  <TextBlock Text="{Binding Path=Attribute.Value}" />
            </DataTemplate>
       </ListView.ItemTemplate>
       </ListView>
</TabItem>

Привязка TabControl.DataContext предоставляет родительский XMLNode элемента Stats. Я знаю это наверняка, так как я использую подузлы родителя в другом месте, и они работают правильно. Я не знаю, что поставить для ListView ItemsSource или для привязок текстового блока DataTemplate. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Почему бы просто не связать просмотр списка с атрибутами?

XAML:

<Window x:Class="WPF1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPF1"
        Title="MainWindow" Height="350" Width="350">

    <StackPanel>
        <StackPanel.Resources>
            <local:AttributesToEnumerableConverter x:Key="AttributesToEnumerableConverter" />
        </StackPanel.Resources>
        <ListView ItemsSource="{Binding Path=Stats, Converter={StaticResource AttributesToEnumerableConverter}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Name}" Margin="5" />
                        <TextBlock Text="{Binding Path=Value}" Margin="5" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>

</Window>

Код:

using System;
using System.Windows;
using System.Windows.Data;
using System.Xml.Linq;

namespace WPF1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;
        }

        public XElement Stats
        {
            get { return XElement.Parse("<Stats HP=\"55000\" MP=\"2500\" SP=\"2500\" Strength=\"212\" Vitality=\"125\" Magic=\"200\" Spirit=\"162\" Skill=\"111\" Speed=\"109\" Evasion=\"100\" MgEvasion=\"100\" Accuracy=\"100\" Luck=\"55\" />"); }
        }
    }

    public class AttributesToEnumerableConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (value as XElement).Attributes(); 
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
1 голос
/ 31 октября 2011

Не следует использовать XPath в привязке ItemsSource, поскольку вы хотите нацелить коллекцию Attributes на объект * XmlNode.Убедитесь, что у вас уже есть элемент Stats как DataContext, затем установите Path на Attributes:

<ListView ItemsSource="{Binding Attributes}" DataContext="<bind to stats element if necessary>">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Stat" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Value" DisplayMemberBinding="{Binding Value}"/>
        </GridView>
    </ListView.View>
</ListView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...