2009-04-16 39 views

Trả lời

2

Điều này được dựa trên nguồn của người khác mà tôi không thể nhớ, nhưng chúng tôi sử dụng nó để giúp tìm hình ảnh của trẻ em thuộc loại. Nó có thể không phải là cách sử dụng hiệu quả nhất cho kịch bản này nhưng nó có thể giúp bạn đi đúng hướng.

public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is childItem) 
       return (childItem)child; 

      childItem childOfChild = FindVisualChild<childItem>(child); 
      if (childOfChild != null) 
       return childOfChild; 
     } 
     return null; 
    } 

[Chỉnh sửa 4.16.09] Dựa trên đó, hãy thử phương pháp này. Nên tìm tất cả các hộp kiểm tra và thay đổi trạng thái như được cung cấp, có thể gọi từ trình xử lý sự kiện của bạn trên các sự kiện được kiểm tra/bỏ chọn.

public static void CheckAllBoxes(DependencyObject obj, bool isChecked) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      // If a checkbox, change IsChecked and continue. 
      if (obj is CheckBox) 
      { 
       ((CheckBox) obj).IsChecked = isChecked; 
       continue; 
      } 

      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      CheckAllBoxes(child, isChecked); 
     } 
    } 
0

Tôi sẽ sử dụng các tính năng dữ liệu mới trong WPF. Cung cấp cho tất cả các hộp kiểm một ràng buộc một chiều trên thuộc tính IsChecked của chúng với nguồn ràng buộc là thuộc tính IsChecked của hộp kiểm chính.

Một tùy chọn khác là sử dụng trình kích hoạt

7

Điều này có thể được thực hiện một cách rõ ràng. Sau đây tạo cột hộp kiểm cho mỗi hàng và có thể chuyển đổi các lựa chọn hàng. Bạn có thể nhấp vào tiêu đề của cột hộp kiểm để chọn tất cả các hàng.

phần có liên quan từ XAML

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"> 
    <toolkit:DataGrid Name="dataGrid" 
    ItemsSource="{Binding}" AutoGenerateColumns="True" 
    SelectionMode="Extended" CanResizeRows="False"> 
    <toolkit:DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <Grid> 
       <CheckBox IsChecked="{ 
        Binding Path=IsSelected, 
        Mode=TwoWay, 
        RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type toolkit:DataGridRow}}}" 
      /> 
      </Grid> 
     </DataTemplate> 
    </toolkit:DataGrid.RowHeaderTemplate> 
    </toolkit:DataGrid> 
</Window> 
0
DataColumn dt = null;    
     for (int i = 0; i < dataGrid.Columns.Count; i++) 
     { 

    dt = new DataColumn("Column Name"); 

      dt.DataType = typeof(Boolean); 
      dt.DefaultValue = false; 
      dataTable.Add(dt); 
     } 

dataGied.DataContext = dataTable; 



<Custom:DataGrid x:Name="dataGrid" AutoGenerateColumns="True" ItemsSource="{Binding}" />      

Vâng nó chỉ là một ý tưởng thô, hy vọng điều này làm việc

5

Dưới đây là DataGrid mẫu chúng tôi sử dụng trong Net tập tin 4,0 XAML :

<DataGrid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellStyle="{StaticResource NameListCol}"> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 
       </DataTemplate>        
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate>       
       <DataTemplate> 
        <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate>        
     </DataGridTemplateColumn> 
     <DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" CellStyle="{StaticResource NameListCol}"/> 
     <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" CellStyle="{StaticResource NameListCol}"/> 
     <DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" CellStyle="{StaticResource NameListCol}"/> 
    </DataGrid.Columns> 
</DataGrid> 

Đây là codebehind:

private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked) 
{ 
    foreach (CheckedMusicFile mf in TheMissingChildren) 
    { 
     mf.Checked = IsChecked; 
    } 
    dgMissingNames.Items.Refresh(); 
} 

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    HeadCheck(sender, e, true); 
} 

private void CheckBox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    HeadCheck(sender, e, false); 
} 

TheMissingChildren là cấu trúc đối tượng đơn giản với một số thuộc tính chuỗi và boolean được chọn.

HTH.

+0

nếu bạn không định sử dụng đối tượng người gửi hoặc routedeventargs trong HeadCheck, bạn không nên chuyển chúng trong – UrbanEsc

+0

'UpdateSourceTrigger = PropertyChanged' sẽ giúp tôi. Cảm ơn. – AechoLiu

Các vấn đề liên quan