2011-10-31 55 views
0

我需要能够在WPF列表视图中使用一系列属性作为源。我目前被困在如何做到这一点。我知道如何为XML节点而不是属性。下面是我想要绑定过一个例子:在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。我知道这是肯定的,因为我在其他地方使用父级的子节点并且它们正常工作。我不知道应该为ListView ItemsSource或DataTemplate的文本块绑定放置什么。有人知道如何做到这一点?

回答

1

您不应该在ItemsSource绑定中使用XPath,因为您要将目标设置为XmlNode对象上的Attributes集合。你应该确保你已经具有Stats元素DataContext,然后设置PathAttributes

<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> 
1

为什么不绑定列表视图的属性?

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(); 
     } 
    } 
}