2012-04-25 27 views
-1

私はGroupBoxコンテナ内でグループ化された3つの異なるListViewsをバインドする必要があるWPFアプリケーションで作業しています。WPF:ListViewのデータ項目をすべて選択/選択解除するチェックボックスコントロール

これは、表示のためのXAMLです:

<GroupBox Header="Zone2 Sensors" Height="250" Name="grpBoxZone2" Width="380" Margin="25,248,90,660" Grid.Column="5" Grid.ColumnSpan="2" Foreground="#FF1E5EE6"> 
    <Grid Height="250" Width="375" MinHeight="250"> 
     <Label Content="Strain" Width="40" Name="labelZone2S" Foreground="#FF1E5EE6" Margin="44,1,291,227" /> 
     <Label Content="Accelerometer" Width="79" Name="labelZone2A" Foreground="#FF1E5EE6" Margin="132,1,164,227" /> 
     <Label Content="Tilt" Name="labelZone2T" Foreground="#FF1E5EE6" Margin="264,1,82,227" /> 
     <ListView Margin="25,42,268,49" Name="lst2" ItemsSource="{Binding}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" BorderThickness="0" SelectionChanged="lst2_SelectionChanged"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Border Padding="5" Background="#FF83A2DA" BorderThickness="1" BorderBrush="Black"> 
         <CheckBox Name="CheckBoxs1" IsChecked="{Binding IsSelected}" Click="CheckBoxs1_Click" Unchecked="CheckBoxs1_Unchecked"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding ObjectData}"></TextBlock> 
          </StackPanel> 
         </CheckBox> 
        </Border> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
     <ListView Margin="134,42,159,111" Name="lstZone2A" ItemsSource="{Binding}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" BorderThickness="0" SelectionChanged="lstZone2A_SelectionChanged"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Border Padding="5" Background="#FF83A2DA" BorderThickness="1" BorderBrush="Black"> 
         <CheckBox Name="ChkZone2A" IsChecked="{Binding IsSelected}" Checked="ChkZone2A_Checked" Unchecked="ChkZone2A_Unchecked"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding ObjectData}"></TextBlock> 
          </StackPanel> 
         </CheckBox> 
        </Border> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
     <ListView Margin="249,42,44,156" Name="lstZone2T" ItemsSource="{Binding}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" BorderThickness="0" SelectionChanged="lstZone2T_SelectionChanged"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Border Padding="5" Background="#FF83A2DA" BorderThickness="1" BorderBrush="Black"> 
         <CheckBox Name="ChkZone2T" IsChecked="{Binding IsSelected}" Checked="ChkZone2T_Checked" Unchecked="ChkZone2T_Unchecked"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding ObjectData}"></TextBlock> 
          </StackPanel> 
         </CheckBox> 
        </Border> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
     <CheckBox Content="Select ALL Sensors" Margin="14,21,248,213" Name="chkZone2SelectAll" Checked="chkZone2SelectAll_Checked" Unchecked="chkZone2SelectAll_Unchecked" /> 
    </Grid> 
</GroupBox> 

これは、C#の私がチェックするために使用したコードのチェックを外しアイテムです。

private void chkZone2SelectAll_Checked(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < lst2.Items.Count; i++) 
     { 
       // Get a all list items from listbox 
       ListBoxItem ListBoxItemObj = (ListBoxItem)lst2.ItemContainerGenerator.ContainerFromItem(lst2.Items[i]); 
       //bool check = ListBoxItemObj.HasContent; 
       // find a ContentPresenter of that list item.. [Call FindVisualChild Method] 
       ContentPresenter ContentPresenterObj = FindVisualChild<ContentPresenter>(ListBoxItemObj); 

       // call FindName on the DataTemplate of that ContentPresenter 
       DataTemplate DataTemplateObj = ContentPresenterObj.ContentTemplate; 
       CheckBox Chk = (CheckBox)DataTemplateObj.FindName("CheckBoxs1", ContentPresenterObj); 
       Chk.IsChecked = true; 
     } 
     for (int i = 0; i < lstZone2A.Items.Count; i++) 
     { 
      // Get a all list items from listbox 
      ListBoxItem ListBoxItemObj = (ListBoxItem)lstZone2A.ItemContainerGenerator.ContainerFromItem(lstZone2A.Items[i]); 

      // find a ContentPresenter of that list item.. [Call FindVisualChild Method] 
      ContentPresenter ContentPresenterObj = FindVisualChild<ContentPresenter>(ListBoxItemObj); 

      // call FindName on the DataTemplate of that ContentPresenter 
      DataTemplate DataTemplateObj = ContentPresenterObj.ContentTemplate; 
      CheckBox Chk = (CheckBox)DataTemplateObj.FindName("ChkZone2A", ContentPresenterObj); 
      Chk.IsChecked = true; 
     } 
     for (int i = 0; i < lstZone2T.Items.Count; i++) 
     { 
      // Get a all list items from listbox 
      ListBoxItem ListBoxItemObj = (ListBoxItem)lstZone2T.ItemContainerGenerator.ContainerFromItem(lstZone2T.Items[i]); 

      // find a ContentPresenter of that list item.. [Call FindVisualChild Method] 
      ContentPresenter ContentPresenterObj = FindVisualChild<ContentPresenter>(ListBoxItemObj); 

      // call FindName on the DataTemplate of that ContentPresenter 
      DataTemplate DataTemplateObj = ContentPresenterObj.ContentTemplate; 
      CheckBox Chk = (CheckBox)DataTemplateObj.FindName("ChkZone2T", ContentPresenterObj); 
      Chk.IsChecked = true; 
     } 
     foreach (TripInfo cbObject in lst2.Items) 
     { 
      cbObject.IsSelected = true; 
     } 
     foreach (TripInfo cbObject in lstZone2A.Items) 
     { 
      cbObject.IsSelected = true; 
     } 
     foreach (TripInfo cbObject in lstZone2T.Items) 
     { 
      cbObject.IsSelected = true; 
     } 
     foreach (TripInfo cbObject in lst2.Items) 
     { 
      if (cbObject.IsSelected) 
      { 
       if (SelectedSensser != null) 
       { 
        if (SelectedSensser.Contains(cbObject.ObjectData.ToString())) { } 
        else 
        { 
         sb.AppendFormat("{0}, ", cbObject.ObjectData.ToString()); 
        } 
       } 
       else 
       { 
        sb.AppendFormat("{0}, ", cbObject.ObjectData.ToString()); 
       } 
       SelectedSensser += sb.ToString().Trim(); 
       sb.Clear(); 
      } 
     } 
     foreach (TripInfo cbObject in lstZone2A.Items) 
     { 
      if (cbObject.IsSelected) 
      { 
       if (SelectedSensser != null) 
       { 
        if (SelectedSensser.Contains(cbObject.ObjectData.ToString())) { } 
        else 
        { 
         sb.AppendFormat("{0}, ", cbObject.ObjectData.ToString()); 
        } 
       } 
       else 
       { 
        sb.AppendFormat("{0}, ", cbObject.ObjectData.ToString()); 
       } 
       SelectedSensser += sb.ToString().Trim(); 
       sb.Clear(); 
      } 
     } 
     foreach (TripInfo cbObject in lstZone2T.Items) 
     { 
      if (cbObject.IsSelected) 
      { 
       if (SelectedSensser != null) 
       { 
        if (SelectedSensser.Contains(cbObject.ObjectData.ToString())) { } 
        else 
        { 
         sb.AppendFormat("{0}, ", cbObject.ObjectData.ToString()); 
        } 
       } 
       else 
       { 
        sb.AppendFormat("{0}, ", cbObject.ObjectData.ToString()); 
       } 
       SelectedSensser += sb.ToString().Trim(); 
       sb.Clear(); 
      } 
     } 
    } 
    catch (Exception ex) { throw ex; } 
} 

private ChildControl FindVisualChild<ChildControl>(DependencyObject DependencyObj) where ChildControl : DependencyObject 
{ 
    int count = VisualTreeHelper.GetChildrenCount(DependencyObj); 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(DependencyObj); i++) 
    { 
     DependencyObject Child = VisualTreeHelper.GetChild(DependencyObj, i); 

     if (Child != null && Child is ChildControl) 
     { 
      return (ChildControl)Child; 
     } 
     else 
     { 
      ChildControl ChildOfChild = FindVisualChild<ChildControl>(Child); 

      if (ChildOfChild != null) 
      { 
       return ChildOfChild; 
      } 
     } 
    } 
    return null; 
} 

public class TripInfo 
{ 
public TripInfo(string objectData) { ObjectData = objectData; } 

public TripInfo(bool isSelected, string objectData) 
{ 
    IsSelected = isSelected; 

    ObjectData = objectData; 
} 

public Boolean IsSelected 
{ get; set; } 
public String ObjectData 
{ get; set; } 

} 

ときしかし、これは私に次のエラーを与えます8番目のインデックスに達しましたが、ListItemsの数は10個の要素を示します:

Value cannot be null. 
Parameter name: element 

答えて

0

ありがとう私はこの問題を解決する方法を見つけました。これは何かを難しくしています :-)垂直スクロールの下に来るリストアイテム、または表示されていないアイテムがFindVisualChildクラスで見つからないと言うことができます。リストビューと見つかったすべての項目の高さを増やします。

0

私はあなたのデータを表示するためにバインディングとテンプレートを使用しているのを参照してください。
あなたのビューモデルでICommandを簡単に呼び出して、すべての項目をIsSelected=Trueに設定できます。 INotifyPropertyChangedを正しく実装すればうまくいくはずです。コードビハインド/ FindVisualはもう必要ありません。

関連する問題