2

我有一个包含文件列表、创建日期和文件大小的 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;
    }
}
4

3 回答 3

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;
        }
    }

于 2009-07-30T18:01:38.300 回答
0

遗憾的是,您将无法单独在 XAML 中执行此操作。

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

于 2009-07-30T18:01:59.110 回答
0

你有 3 个选项。

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

  2. 我从来没有尝试过,但是您也许可以使用 Kent Boogaart 的“表达式值转换器”,它允许您在绑定表达式中编写少量的 C#-Like 代码:http ://wpfconverters.codeplex.com/

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

于 2009-07-30T18:02:43.397 回答