C# 在WPF中使用XML属性作为列表源
我需要能够在WPF列表视图中使用一系列属性作为源。我目前一直在思考如何做到这一点。我知道如何处理XML节点,但不知道如何处理属性。下面是我试图绑定的一个示例:C# 在WPF中使用XML属性作为列表源,c#,wpf,xml,xaml,data-binding,C#,Wpf,Xml,Xaml,Data Binding,我需要能够在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=
<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" />
我希望每个stat名称/值都是listview中的一个条目。以下是我一直试图实现的代码:
<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绑定公开Stats元素的父XMLNode。我知道这一点,因为我在其他地方使用父节点的子节点,它们工作正常。我不知道该为ListView ItemsSource或DataTemplate的textblock绑定放置什么。有人知道如何执行此操作吗?您不应该在
ItemsSource
绑定中使用XPath
,因为您希望将集合作为对象的目标。您应该确保您已经将Stats
元素设置为DataContext
,然后将路径设置为属性
:
<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>
为什么不将listview绑定到属性
XAML:
代码隐藏:
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();
}
}
}
使用系统;
使用System.Windows;
使用System.Windows.Data;
使用System.Xml.Linq;
命名空间WPF1
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
DataContext=this;
}
公共行政统计
{
获取{return XElement.Parse(“”;}
}
}
公共类AttributesToEnumerableConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回(值为XElement.Attributes();
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
}
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();
}
}
}