Код C # для выбора всех флажок в сетке данных wpf - PullRequest
8 голосов
/ 16 апреля 2009

Мне нужен код c #, чтобы установить / снять все флажки в сетке данных в рамках WPF 3.5. Я хотел бы сделать это, установив флажок в заголовке в сетке.

Пожалуйста, помогите.

Ответы [ 5 ]

7 голосов
/ 22 июля 2009

Это можно сделать декларативно. Следующее создает столбец флажка для каждой строки и может переключать выбор строк. Для выбора всех строк можно щелкнуть заголовок столбца флажка.

Соответствующие порции из 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>
5 голосов
/ 05 мая 2011

Вот пример таблицы данных, которую мы используем в XAML-файле .Net 4.0:

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

Вот код:

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 - это простая структура объектов с некоторыми строковыми свойствами и проверенным логическим значением.

НТН.

2 голосов
/ 16 апреля 2009

Это основано на чьем-то другом источнике, который я не могу вспомнить, но мы используем его, чтобы помочь найти визуальных потомков типа. Возможно, это не самое эффективное использование для этого сценария, но это может помочь вам выбрать правильный путь.

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

[Изменить 4.16.09] Исходя из этого, попробуйте этот метод. Должен найти все флажки и изменить состояние в соответствии с предоставлением, вызываемым из вашего обработчика событий для событий Checked / Unchecked.

   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 голосов
/ 04 ноября 2009
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}" />                    

Ну, это просто грубая идея, надеюсь, это сработает

0 голосов
/ 21 апреля 2009

Я бы использовал новые функции привязки данных в WPF. Присвойте всем флажкам одностороннюю привязку к их свойству IsChecked, а источником привязки будет свойство IsChecked главного флажка.

Другим вариантом будет использование триггеров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...