2009-07-30 8 views
2

J'ai un GridView qui contient une liste de fichiers, dates créées et tailles de fichiers. En dessous de la grille, j'ai un bloc de texte qui indique "X Files Selected Y MB". Je peux lier à SelectedItems.Count très bien, mais puis-je facilement lier à la somme des tailles de fichiers pour ceux qui sont sélectionnés?Liaison à une somme de SelectedItems dans WPF GridView

Les points d'interrogation ci-dessous doivent correspondre à la somme des valeurs de la colonne selectedItems fileSize. Des idées?

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

Je sais que je peux obtenir ce fait dans le codebehind - mais je voudrais essayer de garder mon codebehind vide et le faire dans le XAML. Ceci est le code codebehind:

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

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

Répondre

6

Vous allez devoir utiliser un convertisseur pour cela. Un exemple: 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

Nice. Bien joué. –

+0

Merci pour l'exemple - je suppose que cela fonctionnera très bien - mais j'ai besoin de la liaison pour mettre à jour sur FilesList_SelectionChanged. Je ne sais pas comment faire cela. – djschwartz

+0

Il doit automatiquement être actualisé sur selectionChanged car vous utilisez SelectedItems comme source de liaison. Si cela ne fonctionne pas, vous pouvez toujours essayer d'accéder à la liaison et l'actualiser. – apandit

0

Malheureusement, vous ne serez pas en mesure de le faire en XAML, seul.

Vous devrez vous connecter aux SelectedItems eux-mêmes et fournir un convertisseur de valeur. Le convertisseur de valeur doit parcourir chaque chemin de fichier, créer un objet FileInfo à partir du chemin d'accès et additionner les tailles à l'aide de la propriété FileInfo.Length.

0

Vous avez 3 options.

  1. Vous pouvez créer une propriété sum dans n'importe quelle entité à laquelle vous liez (votre entité FilesList). Cela vous obligera à changer votre collection FilesList en CollectionView afin que vous puissiez accéder à la propriété SelectedItems à partir de votre ViewModel (si vous ne le faites pas déjà).

  2. Je ne l'ai jamais essayé, mais vous pourriez être en mesure d'utiliser « Expression Value Converter » qui vous permet d'écrire des petits morceaux de code C# -Comme dans vos expressions de liaison de Kent Boogaart: http://wpfconverters.codeplex.com/

  3. Fournir un simple ValueConverter qui convertit une collection de n'importe quelle entité en décimal ou autre (c'est probablement la chose la plus simple à faire).

+0

Apandit a posté un très bel exemple d'option # 3. –