2012-04-25 103 views
-1

我正在WPF應用程序中,我必須綁定三個不同ListViews集合在一個GroupBox容器中。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; } 

} 

然而,這給了我下面的錯誤時,到達第八指數,但ListItems計數示出了10個元件:

Value cannot be null. 
Parameter name: element 

回答

0

感謝所有誰只是訪問這個問題。我找到了解決這個。這是棘手的 :-)。垂直滾動下的Listitems或您可以說那些不可見的項目FindVisualChild類沒有找到。當我增加listview的高度和找到的所有項目。

0

我看到你正在使用綁定和模板來顯示你的數據。
您可以在您的視圖模型上輕鬆調用ICommand並將所有項目設置爲IsSelected=True。如果你已經正確實施了INotifyPropertyChanged,它應該可以工作,而且你不再需要代碼隱藏/ FindVisual。

相關問題