gpt4 book ai didi

c# - 如何根据 XAML 中定义的 XMLDataProvider 数据计算平均值

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:23 25 4
gpt4 key购买 nike

我是 WPF 新手,需要您的帮助。我有一个允许用户检查大陆和查看包含国家的应用程序。 Country 有两个属性:name 和 area。问题是我需要显示所有大陆国家的平均面积。我的数据模型是这样的:

       <XmlDataProvider x:Key="CountryStoreDataSource" XPath="CountryStore">
<x:XData>
<CountryStore xmlns="">
<Continents Continent="Europe">
<Countries Country="Italy" Area="300"/>
<Countries Country="Iceland" Area="350"/>
</Continents>
<Continents Continent="Asia">
<Countries Country="China" Area="700"/>
<Countries Country="India" Area="650"/>
</Continents>
<Continents Continent="Africa">
<Countries Country="South Africa" Area="550"/>
<Countries Country="Egypt" Area="500"/>
</Continents>
</CountryStore>
</x:XData>
</XmlDataProvider>

我还有连接列表框和我的数据模型的模板:

        <Grid.Resources>
<DataTemplate x:Key="countryItemTemplate">
<Label Content="{Binding XPath=@Country}"/>
</DataTemplate>
<DataTemplate x:Key="areaItemTemplate">
<Label Content="{Binding XPath=@Area}"/>
</DataTemplate>
</Grid.Resources>

最后我有了我的列表框的实现:

           <ListBox
Grid.Row="1"
ItemsSource="{Binding XPath=Countries}"
ItemTemplate="{StaticResource countryItemTemplate}"
Margin="0,0,0,0" />
<ListBox
Grid.Row="1"
ItemsSource="{Binding XPath=Countries}"
ItemTemplate="{StaticResource areaItemTemplate}"
Margin="0,0,0,0"
Grid.Column="1"
Name="listBoxAreas"
/>

实际上,我不知道如何在 C# 代码中从列表框中获取我的值,有什么方法可以获取值并在 xml 中对它们进行处理吗?谢谢。

最佳答案

有趣的问题!

首先,您使用的 XPath 似乎并不完全正确。如果我理解正确的话,您想显示一个包含国家/地区的列表框、一个包含区域的列表框和一个包含Avg(areas) 的 TextBlock。

首先,让我们简化 XPath 绑定(bind)。您应该更新 XmlDataSource 上的 XPath,这样您就可以获得独立于大陆的国家/地区列表:

    <XmlDataProvider x:Key="CountryStoreDataSource" XPath="/CountryStore/Continents/Countries">
<x:XData>
<CountryStore xmlns="">
<Continents Continent="Europe">
<Countries Country="Italy" Area="300"/>
<Countries Country="Iceland" Area="350"/>
</Continents>
<Continents Continent="Asia">
<Countries Country="China" Area="700"/>
<Countries Country="India" Area="650"/>
</Continents>
<Continents Continent="Africa">
<Countries Country="South Africa" Area="550"/>
<Countries Country="Egypt" Area="500"/>
</Continents>
</CountryStore>
</x:XData>
</XmlDataProvider>

然后,设置Grid的DataContext:

<Grid DataContext="{StaticResource CountryStoreDataSource}"  ../>

之后,ListBox 的两个绑定(bind)都可以更新为:ItemsSource="{Binding}"


现在,回到问题:显示区域的平均值。为此,您需要绑定(bind)到同一个列表并应用转换器来进行计算。
首先,让我们创建转换器,它简单地解析列表并使用 LINQ 计算平均值:

public class AreaConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return 0;

//you can do this in one line, but I split it for clarity.
var xml = value as IEnumerable<XmlNode>;
var areas = xml.Select(x => x.Attributes["Area"].Value);
var avg = areas.Average(a => int.Parse(a));

return avg;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportException();
}
}

之后,您可以创建 TextBlock 以使用此绑定(bind)保存此值:

 <TextBlock Text="{Binding Converter={local:AreaConverter}}" />

现在 TextBlock 应该显示平均值!

提示:要测试给定的 XPath,您可以将 Notepad++ 与 XML Tools 插件结合使用,该插件提供了一个Evaluate XPath Expression 工具

关于c# - 如何根据 XAML 中定义的 XMLDataProvider 数据计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com