绑定到WPF GridView中的SelectedItems总和

时间:2009-07-30 17:43:02

标签: wpf gridview binding selecteditem

我有一个GridView,其中包含文件列表,创建日期和文件大小。在网格下方,我有一个文本块,上面写着“X Files Selected.Y MB”。我可以很好地绑定到SelectedItems.Count,但是我可以轻松地绑定到所选文件大小的总和吗?

下面的问号应该是SelectedItems fileSize列值的总和。有什么想法吗?

<TextBlock HorizontalAlignment="Right">
        <TextBlock.Text>
            <MultiBinding StringFormat=" {0} Files Selected. {1} MB">
                <Binding ElementName="FilesList" Path="SelectedItems.Count"></Binding>
                <Binding ElementName="FilesList" Path="SelectedItems.?????"></Binding>
            </MultiBinding>
        </TextBlock.Text>
</TextBlock>

我知道我可以在代码隐藏中完成这项工作 - 但是我希望将我的代码隐藏为空并在XAML中执行。这是代码隐藏代码:

private void FilesList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    double x = 0;

    foreach (FileInfo fileInfo in FilesList.SelectedItems)
    {
        x += fileInfo.Length;
    }
}

3 个答案:

答案 0 :(得分:6)

你将不得不使用转换器。一个例子: XAML:




<MultiBinding StringFormat=" {0} Files Selected. {1} MB">
                        <Binding ElementName="FilesList" Path="SelectedItems.Count"></Binding>
                        <Binding ElementName="FilesList" Path="SelectedItems" Converter="{StaticResource sumconverter}"></Binding>
                </MultiBinding>

代码隐藏:


[ValueConversion(typeof(ListViewItem[]), typeof(string))]
    class SumConverter : IValueConverter {
        public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
            int size = 0;
            ListViewItem[] items = (ListViewItem[])value;
            if(items != null){
                foreach(var lvi in items){
                    Someclass sc = lvi.content as Someclass;
                    if(sc!=null){
                        size += sc.Size;
                    }
                }
            }
            return (size / 1000) + "MB";
        }

        public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) {
            return null;
        }
    }

答案 1 :(得分:0)

可悲的是,您无法单独在XAML中执行此操作。

您需要绑定到SelectedItems本身并提供值转换器。值转换器需要迭代每个文件路径,从路径创建FileInfo对象,并使用FileInfo.Length属性总结大小。

答案 2 :(得分:0)

您有3个选项。

  1. 您可以在要绑定的任何实体(您的FilesList实体)中创建sum属性。这将要求您将FilesList集合更改为CollectionView,以便您可以从ViewModel访问SelectedItems属性(如果您还没有这样做)。

  2. 我从来没有尝试过这个,但你可以使用Kent Boogaart的“表达式值转换器”,它允许你在绑定表达式中编写一小段C#-Like代码:http://wpfconverters.codeplex.com/ < / p>

  3. 提供一个简单的ValueConverter,它将您实体的任何集合转换为小数或其他(这可能是最简单的事情)。