Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中使用XML属性作为列表源_C#_Wpf_Xml_Xaml_Data Binding - Fatal编程技术网

C# 在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=

我需要能够在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" />

我希望每个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();
        }
    }
}