2011-10-31 49 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(); 
     } 
    } 
}