Привязка флажка в заголовке сетки данных - PullRequest
1 голос
/ 26 июля 2010

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

Возможно ли добавить эту функцию только с привязкой в ​​XAML (событие не отмечено).

<sdk:DataGrid AutoGenerateColumns="False" Grid.Row="1"  Name="grid" ItemsSource="{Binding myCollection, Mode=TwoWay}" >
        <sdk:DataGrid.Columns>
            <sdk:DataGridCheckBoxColumn Binding="{Binding myCollection.UserSelected, Mode=TwoWay}" >
                <sdk:DataGridCheckBoxColumn.HeaderStyle>
                    <Style TargetType="sdk:DataGridColumnHeader">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <CheckBox x:Name="checkAll" IsThreeState="True"  
                                              IsChecked="{Binding myCollection.UserSelected, Mode=TwoWay, Converter={StaticResource threeStateConverter}}"/>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </sdk:DataGridCheckBoxColumn.HeaderStyle>
            </sdk:DataGridCheckBoxColumn>
            <sdk:DataGridTextColumn Binding="{Binding Description}" Header="Chemin" />
        </sdk:DataGrid.Columns>
    </sdk:DataGrid>

Я думаю, что-то не так с частью "myCollection.UserSelected".ThreeStateConverter - это преобразователь значений, который будет возвращать значение NULL при выборе некоторых элементов, значение true, если все они выбраны и т. Д., Но метод Convert никогда не вызывается (даже если событие PropertyChanged возникает, когда UserSelectedизменилось).

Есть идеи, как мне это сделать?Спасибо.

1 Ответ

3 голосов
/ 21 апреля 2011

Возможно, вы уже решили проблему, но тем не менее:

<navigation:Page.Resources>
    <model:MyModel x:Key="Model"/>
</navigation:Page.Resources>
...    
<data:DataGridTemplateColumn Width="Auto" >
    <data:DataGridTemplateColumn.HeaderStyle>
        <Style TargetType="datap:DataGridColumnHeader">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <CheckBox IsThreeState="True" Margin="2,0,-13,0" DataContext="{StaticResource Model}" IsChecked="{Binding Path=AllChecked, Mode=TwoWay}"/>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </data:DataGridTemplateColumn.HeaderStyle>
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Checked, Mode=TwoWay}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>

MyModel класс содержит bool? свойство, которое реализует логику выбора.Он также используется как `DataContext of page.

. Я должен признать, что это может иметь проблемы, если нам нужно изменить модель.

РЕДАКТИРОВАТЬ: я нашел другой способ:

<navigation:Page.DataContext>
    <model:MyModel />
</navigation:Page.DataContext>
...    
<data:DataGridTemplateColumn Width="Auto" >
    <data:DataGridTemplateColumn.HeaderStyle>
        <Style TargetType="datap:DataGridColumnHeader">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <CheckBox IsThreeState="True" Margin="2,0,-13,0" IsChecked="{Binding Path=DataContext.AllChecked, ElementName=LayoutRoot, Mode=TwoWay}"/>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </data:DataGridTemplateColumn.HeaderStyle>
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Checked, Mode=TwoWay}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>

Здесь мы привязываем DataContext корневого элемента макета (обычно называемого LayoutRoot), который по умолчанию наследует свой контекст данных от страницы.

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