2009-07-30 2 views
2

파일 목록, 생성 된 날짜 및 파일 크기가 포함 된 GridView가 있습니다. 그리드 아래에 "X Files Selected. Y MB"라는 텍스트 블록이 있습니다. SelectedItems.Count에 바인딩 할 수 있지만 선택한 파일 크기의 합계에 쉽게 바인딩 할 수 있습니까?WPF GridView에서 SelectedItems의 합계에 바인딩

아래의 물음표는 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; 
    } 
} 

답변

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> 
 

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

니스 잘 했어. –

+0

예를 들어 주셔서 감사합니다 -이 잘 작동합니다 가정합니다 -하지만 FilesList_SelectionChanged에 대한 업데이트 바인딩이 필요합니다. 그것을 성취하는 방법을 모릅니다. – djschwartz

+0

SelectedItems를 바인딩 소스로 사용하고 있으므로 selectionChanged에서 자동으로 새로 고쳐야합니다. 그래도 작동하지 않으면 항상 바인딩에 액세스하여 새로 고칩니다. – apandit

0

슬프게도, 당신은 혼자가, XAML에서이 작업을 수행 할 수 없습니다.

SelectedItem 자체에 바인딩하고 값 변환기를 제공해야합니다. 값 변환기는 각 파일 경로를 반복해야하며 경로에서 FileInfo 개체를 만들고 FileInfo.Length 속성을 사용하여 크기를 합산해야합니다.

0

세 가지 옵션이 있습니다.

  1. 바인딩하는 모든 엔터티 (FilesList 엔터티)에서 sum 속성을 만들 수 있습니다. 이렇게하면 FileList 컬렉션을 CollectionView로 변경해야 ViewModel에서 SelectedItems 속성에 액세스 할 수 있습니다 (아직 수행하지 않은 경우).

  2. 이 시도 적이 있지만, 당신은 당신이 당신의 바인딩 표현식에서 C# 형 코드의 작은 비트를 쓸 수 있습니다 켄트 Boogaart의 "표현 값 변환기"를 사용 할 수 있습니다 http://wpfconverters.codeplex.com/

  3. 하는 제공을 귀하의 엔티티가 십진수 또는 무엇이든간에 컬렉션을 변환하는 간단한 ValueConverter (이것은 아마도 가장 간단한 작업입니다).

+0

Apandit은 옵션 # 3의 좋은 예를 게시했습니다. –