【问题标题】:Binding to a sum of SelectedItems in WPF GridView绑定到 WPF GridView 中的 SelectedItems 的总和
【发布时间】:2010-11-15 13:01:45
【问题描述】:

我有一个 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;
    }
}

【问题讨论】:

    标签: wpf gridview binding selecteditem


    【解决方案1】:

    您有 3 个选项。

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

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

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

    【讨论】:

    • Apandit 发布了一个非常好的选项 #3 示例。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您将不得不为此使用转换器。一个例子: 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; } }

      【讨论】:

      • 感谢您的示例 - 我认为这将正常工作 - 但我需要在 FilesList_SelectionChanged 上更新绑定。不知道如何实现。
      • 它应该在 selectionChanged 上自动刷新,因为您使用 SelectedItems 作为绑定源。如果这不起作用,您可以随时尝试访问绑定并刷新它。
      • 我以为它会自动刷新,但它没有。我在转换器中放置了一个断点,它仅在视图首次加载时触发。我也试过: //BindingExpression bindingExpression = FilesSelectedTextBlock.GetBindingExpression(TextBlock.TextProperty); if bindingExpression != null bindingExpression.UpdateTarget();但 bindingExpression 始终为空。
      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2011-09-18
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2013-11-02
      • 2011-06-04
      • 2011-06-27
      相关资源
      最近更新 更多