снял любой флажок CellTemplate из списка, я хочу снять флажок заголовка

Я создал таблицу данных, которая содержит 4 столбца, 3 строки и еще один логический тип. я сопоставил datatable (xmldatadocument) с datagridview в wpf. таким образом, в результате получается текстовый столбец и столбец флажка в сетке данных. И я добавил шаблон заголовка флажка в заголовок столбца флажка. Я могу снять все флажки в столбце, когда флажок в заголовке не установлен. Я также могу выполнить проверку всех флажков в столбце, когда установлен флажок заголовка заголовка. Но я немного обеспокоен тем, что если один из флажков в этом столбце не отмечен, мне также нужно снять флажок заголовка. Пожалуйста, помогите мне решить это. Я добавил скриншот, XAML и код ниже.

Datagridview

PS: с использованием сетки данных WPF.

<dg:DataGrid.Columns>
                <dg:DataGridCheckBoxColumn Binding="{Binding Check}" Width="50" >
                    <dg:DataGridCheckBoxColumn.HeaderTemplate>
                        <DataTemplate x:Name="dtAllChkBx">
                            <CheckBox Name="cbxAll" Content="{x:Static properties:Resources.lblAll}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"></CheckBox>
                        </DataTemplate>
                    </dg:DataGridCheckBoxColumn.HeaderTemplate>


public static ObservableCollection<Lst> list = new ObservableCollection<Lst>();
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < list.Count; i++)
    {
        list[i].Check = true;
    }
}

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < list.Count; i++)
    {
        list[i].Check = false;
    }
}

public class Lst : ObservableCollection<Lst>
{
    public bool Check { get; set; }
}  

person iYadav    schedule 19.04.2012    source источник
comment
разве вы не должны установить для проверки значение true для события Checked и false для события Unchecked? вы, кажется, сделали обратное. Кроме того, привязан ли первый к столбцу флажка в сетке?   -  person Akanksha Gaur    schedule 19.04.2012
comment
@Dzire Я исправил это. Да lst привязан к столбцу флажка в сетке.   -  person iYadav    schedule 19.04.2012
comment
Вы вызвали изменение свойства свойства, привязанного к столбцу флажка? Я пробовал на своем конце. Я также привязал флажок заголовка и изменил свойство, привязанное к столбцу. это работает   -  person Akanksha Gaur    schedule 19.04.2012
comment
@Dzire Не могли бы вы поместить сюда код. я тоже попробую со своей стороны.   -  person iYadav    schedule 19.04.2012
comment
@user1328637 user1328637 Пожалуйста, внедрите INotifypropertyChanged в свой класс Lst . Также почитайте что-нибудь на MVVM. Ваш сеттер в вашем классе Lst не имеет Change notification INotifyPropertyChnaged даст вам событие, которое вы можете вызвать в сеттере в вашем Property Check . И да, в таких случаях мы обычно не используем свойство `Auto. Пожалуйста, измените на свойство с резервным полем.   -  person Ankesh    schedule 23.04.2012


Ответы (1)


Вот шаблон управления для заголовка

<Style x:Key="checkBoxHeaderStyle"
                           TargetType="{x:Type w:DataGridColumnHeader}">
                                                    <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type w:DataGridColumnHeader}">
                                    <CheckBox 
                                              IsChecked="{Binding  Path = IsSelectAllChecked , Mode = TwoWay}"/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>

Вот столбец шаблона, применяющий стиль

<w:DataGridTemplateColumn MinWidth="50"
                                              HeaderStyle="{DynamicResource checkBoxHeaderStyle}"
                                              CanUserResize="False">
                        <w:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Name="selectAllCheckBox"
                                                                  HorizontalAlignment="Center"                                              Margin="1,0,0,0"                                                                                            VerticalAlignment="Center"
                                          IsChecked="{Binding Path = IsSelected, Mode=TwoWay}" />
                            </DataTemplate>
                        </w:DataGridTemplateColumn.CellTemplate>
                    </w:DataGridTemplateColumn>

Выбранное свойство

public bool IsSelected
{
    get { return selected; }
    set { selected = value;
    OnPropertyChanged("IsSelected");
    }
}

Флажок для заголовка

public bool IsSelectAllChecked
        {
            get { return isSelectAllChecked; }
            set
            {
                isSelectAllChecked = value;
                base.OnPropertyChanged("IsSelectAllChecked");
//Call the method which sets the IsSelected property to true of false, based on value
                SetAllCheckBoxesState(value);
            }

    }

Я надеюсь, что это помогает :)

person Akanksha Gaur    schedule 19.04.2012
comment
Что делать, если lst не привязан к столбцу флажка в сетке?? какие изменения я должен сделать? Я отредактировал свой код XAML... проверьте, пожалуйста. - person iYadav; 19.04.2012
comment
Проверьте мой код XAML и xaml.cs, а затем дайте мне знать, какие изменения я должен внести в него. - person iYadav; 19.04.2012
comment
ты должен приложить усилия, я дал тебе все. - person Akanksha Gaur; 19.04.2012
comment
я пробовал все, но это не работает :( ни на одном форуме нет решения этой проблемы. :( - person iYadav; 20.04.2012
comment
Надеюсь, вы связали свой столбец флажка со свойством Check и установили режим d как двусторонний, дайте код xaml столбца флажка u - person Akanksha Gaur; 20.04.2012
comment
Вы забыли добавить PropertyChangedEventHander в Setter проверки свойства, пожалуйста, сделайте это в первую очередь. - person Akanksha Gaur; 20.04.2012
comment
‹dg:DataGrid.Columns› ‹dg:DataGridCheckBoxColumn Binding={Binding Check} Width=50 › ‹dg:DataGridCheckBoxColumn.HeaderTemplate› ‹DataTemplate x:Name=dtAllChkBx› ‹CheckBox Name=cbxAll IsChecked={Binding ElementName=EnggAcc, Mode =TwoWay, UpdateSourceTrigger=PropertyChanged} Content={x:Static properties:Resources.lblAll} Checked=CheckBox_Checked Unchecked=CheckBox_Unchecked IsEnabled=True›‹/CheckBox› - person iYadav; 23.04.2012
comment
почитайте про INotifyPropertyChange, вам нужно поставить обработчик d для изменения свойства в установщике Check Property. - person Akanksha Gaur; 23.04.2012
comment
я включил PropertyChangedEventHandler. Он говорит, что SetAllCheckBoxesState (значение) не существует ... также я думаю, что у меня есть проблема с привязкой заголовка Checkbox для проверки в XAML. где я должен включить стиль в свой код XAML выше? и могу ли я удалить свойство isSelectAllChecked? - person iYadav; 23.04.2012
comment
SetAllCheckBoxesState — это настраиваемый метод. Посмотрите на реализацию INotifyPropertyChanged в Google. Вы должны научиться связыванию. - person Akanksha Gaur; 23.04.2012
comment
Я не могу определить свойство Style. Проверьте мой код XAML... вы использовали совершенно другие свойства.. я использовал DataGridCheckBoxColumn, HeaderTemplate и DataTemplate, но вы использовали DataGridColumnHeader. VS говорит, что этот тип не найден. - person iYadav; 24.04.2012
comment
Я изучал привязку данных и INotifyPropertyChanged, теперь я могу все это реализовать. Спасибо. это было полезно. - person iYadav; 25.04.2012