1

ここに画像の説明を入力これは私の最初の投稿です。

私が立ち往生している問題は、DataGrid(WPF)のチェックボックスに関連しています。申し訳ありませんが、私は新しいユーザーであるため、問題をよりよく理解するためにスクリーンショットを添付できませんでした。

問題: 子の 1 つがチェックされていない場合でも、DataHeader 列のチェックボックスがチェックされます。子の 1 つがユーザーによって明示的にチェックされていない場合、ALL(Header) が暗黙的にチェックされないようにするために、ソリューションがこれを修正することを期待しています。

みんな助けてください...ありがとう!

リンクを確認してください。私はソリューションがこのように機能することを望みます。http://www.codeproject.com/Articles/42437/Toggling-the-States-of-all-CheckBoxes-Inside-a-Dat#

4

2 に答える 2

1

ビューモデルにバインドするビューがあると思います。私のコードでは、このビューモデルには、gridview ItemsSource にバインドする要素のコレクションと、列ヘッダーの状態を表すプロパティ HeaderChecked があります。すべての要素にはプロパティ IsChecked があります。確かに ViewModel は INotifyPropertyChanged をサポートしています。

これはViewModelのコードです (DataEventsSource は INotifyPropertyChanged を実装するだけです):

public class MainViewModel : DataEventsSource
{
    private ObservableCollection<Element> _elements = new ObservableCollection<Element>
                                                          {
                                                              new Element {IsChecked = false},
                                                              new Element {IsChecked = false},
                                                              new Element {IsChecked = false},
                                                              new Element {IsChecked = false}
                                                          };

    public MainViewModel()
    {
        foreach (var element in _elements)
        {
            element.PropertyChanged += OnElementPropertyChanged;
        }
    }

    private void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "IsChecked")
        {
            bool? headerChecked = null;
            if (Elements.All(el => el.IsChecked))
            {
                headerChecked = true;
            }
            if (Elements.All(el => !el.IsChecked))
            {
                headerChecked = false;
            }

            HeaderChecked = headerChecked;
        }

    }

    public ObservableCollection<Element> Elements
    {
        get
        {
            return _elements;
        }
        set
        {
            _elements = value;
        }
    }

    private bool? _headerChecked = false;
    public bool? HeaderChecked
    {
        get
        {
            return _headerChecked;
        }
        set
        {
            _headerChecked = value;
            OnPropertyChanged("HeaderChecked");
        }
    }
}

public class Element : DataEventsSource
{
    private bool _isChecked;
    public bool IsChecked
    {
        get
        {
            return _isChecked;
        }
        set
        {
            _isChecked = value;
            OnPropertyChanged("IsChecked");
        }
    }
}

コレクションの要素が変更されると、ご覧のとおり、OnElementPropertyChanged メソッドで HeaderChecked プロパティが更新されます。

そして、これはビューです:

コードビハインド:

public partial class MainWindow
{
    private readonly MainViewModel _viewModel = new MainViewModel();

    public MainWindow()
    {
        InitializeComponent();
        DataContext = _viewModel;
    }

    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        foreach (var element in _viewModel.Elements)
        {
            element.IsChecked = true;
        }
    }

    private void CheckBox_UnChecked(object sender, RoutedEventArgs e)
    {
        foreach (var element in _viewModel.Elements)
        {
            element.IsChecked = false;
        }
    }
}

次はXAMLのメイン グリッドです(わかりやすくするために 1 つの列のみが含まれています)。

<Grid x:Name="LayoutRoot">
    <DataGrid x:Name="dataGrid" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Elements}">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn x:Name="checkboxColumn" Binding="{Binding IsChecked, Mode=TwoWay}"  IsThreeState="True" Width="50"  >
                <DataGridCheckBoxColumn.HeaderTemplate>
                    <DataTemplate x:Name="dtAllChkBx">
                        <CheckBox Name="cbxAll" Content="Label" IsChecked="{Binding Path=DataContext.HeaderChecked, ElementName=LayoutRoot, Mode=TwoWay}" Checked="CheckBox_Checked"  Unchecked="CheckBox_UnChecked"></CheckBox>
                    </DataTemplate>
                </DataGridCheckBoxColumn.HeaderTemplate>
            </DataGridCheckBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

このコードがお役に立てば幸いです。誤解していた場合はお知らせください。

于 2012-04-14T14:08:08.863 に答える
1
//this event is for **Checked and UnChecked** of up check box (cbxall)
private void UpCheckbox_Checked(object sender, RoutedEventArgs e)
{
    //checkBox1 = cbxall (your up checkbox)
    if (checkBox1.IsChecked == true)
    {
        dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = true);
    }
    else
    {
        dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = false);
    }
}

//this event is for all other check box
//**Checked and UnChecked** of all other check box is this event
private void OtherCheckbox_Checked(object sender, RoutedEventArgs e)
{
    //checkBox1 = cbxall (your up checkbox)
    if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == true))
    {
        checkBox1.IsChecked = true;
    }
    else if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == false))
    {
        checkBox1.IsChecked = false;
    }
    else
    {
        checkBox1.IsChecked = null;
    }
}

...

于 2012-05-08T06:55:43.970 に答える