我有一个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;
}
}
答案 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个选项。
您可以在要绑定的任何实体(您的FilesList实体)中创建sum属性。这将要求您将FilesList集合更改为CollectionView,以便您可以从ViewModel访问SelectedItems属性(如果您还没有这样做)。
我从来没有尝试过这个,但你可以使用Kent Boogaart的“表达式值转换器”,它允许你在绑定表达式中编写一小段C#-Like代码:http://wpfconverters.codeplex.com/ < / p>
提供一个简单的ValueConverter,它将您实体的任何集合转换为小数或其他(这可能是最简单的事情)。