簡體   English   中英

如何從XAML中定義的XMLDataProvider-data計算平均值

[英]How to calculate the average from XMLDataProvider-data defined in XAML

我真的是WPF的新手,需要您的幫助。 我有允許用戶檢查大洲並查看包含國家的應用程序。 國家有兩個特點:名稱和地區。 問題是我需要顯示所有大洲國家的平均面積。 我的數據模型如下所示:

       <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並不完全正確。 如果我對您的理解正確,則想顯示一個帶有國家的ListBox,一個帶有Areas的ListBox和一個帶有Avg(areas)的TextBlock。

首先,讓我們簡化XPath綁定。 您應該在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>

然后,設置網格的DataContext:

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

之后,可以將ListBoxes的兩個綁定更新為以下內容: ItemsSource="{Binding}"


現在,回到問題所在:顯示平均面積。 為此,您需要綁定到相同的列表並應用轉換器進行計算。
首先,讓我們創建Converter,它簡單地解析列表並使用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來使用此Binding來保存此值:

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

現在,TextBlock應該顯示平均值!

提示 :要測試給定的XPath,可以將Notepad ++與XML Tools插件一起使用,該插件提供了一個Evaluate XPath Expression工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM