2009-07-30 8 views
2

Ich habe eine GridView, die eine Liste von Dateien, erstellten Daten und Dateigrößen enthält. Unterhalb des Gitters habe ich einen Textblock, der sagt "X Dateien ausgewählt. Y MB". Ich kann gut an SelectedItems.Count binden, aber kann ich leicht an die Summe der Dateigrößen für die ausgewählten binden?Bindung an eine Summe von SelectedItems in WPF GridView

Die folgenden Fragezeichen sollten die Summe der SelectedItems fileSize-Spaltenwerte sein. Irgendwelche Ideen?

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

Ich weiß, ich kann dies in dem Code-Behind getan - aber ich mag meinen Code-Behind leer halten und tut es in der XAML. Dies ist der Code-Code:

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

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

Antwort

6

Sie müssen einen Konverter dafür verwenden. Ein Beispiel: 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> 
 

Codebehind:

 

[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; 
     } 
    } 
 
+0

Schön. Gut gemacht. –

+0

Danke für das Beispiel - ich nehme an, das wird gut funktionieren - aber ich brauche die Bindung auf FilesList_SelectionChanged zu aktualisieren. Ich bin mir nicht sicher, wie ich das erreichen soll. – djschwartz

+0

Es sollte automatisch bei selectionChanged aktualisiert werden, da Sie SelectedItems als Bindungsquelle verwenden. Wenn das nicht funktioniert, können Sie immer versuchen, auf die Bindung zuzugreifen und sie zu aktualisieren. – apandit

0

Leider werden Sie nicht in der Lage sein, dies in XAML zu tun, allein.

Sie müssen die SelectedItems selbst binden und einen Wertkonverter bereitstellen. Der Wertkonverter muss über jeden Dateipfad iterieren, ein FileInfo-Objekt aus dem Pfad erstellen und die Größen unter Verwendung der FileInfo.Length-Eigenschaft zusammenfassen.

0

Sie haben 3 Möglichkeiten.

  1. Sie können eine Summeneigenschaft in der Entität erstellen, an die Sie binden (Ihre FilesList-Entität). Dazu müssen Sie Ihre FilesList-Auflistung in eine CollectionView ändern, damit Sie von Ihrem ViewModel aus auf die SelectedItems-Eigenschaft zugreifen können (falls Sie dies nicht bereits tun).

  2. Ich habe nie versucht, diese, aber Sie könnten Kent Boogaart des „Expression Value Converter“ verwenden können, die Sie kleine Stücke von C# -Like Code in Ihrer verbindlichen Ausdrücke schreiben können: http://wpfconverters.codeplex.com/

  3. Bieten ein einfacher ValueConverter, der eine Sammlung von allem, was Ihre Entität ist, in eine Dezimalzahl oder was auch immer konvertiert (dies ist wahrscheinlich die einfachste Sache).

+0

Apandit hat ein wirklich schönes Beispiel von Option # 3 gepostet. –