Как выбрать все флажки столбца в заголовке DataGrid CheckBox в WPF DataGrid - PullRequest
0 голосов
/ 09 сентября 2018

У меня возникла проблема с флажками WPF DataGrid C #.

Я не нахожу способ выбрать все флажки шаблона ячейки, когда установлен флажок шаблона заголовка. во взгляде модель работает нормально. он выбирает все, но в поле зрения не отображается ни один выбранный флажок, отмеченный / отмеченный флажком отмеченного заголовка. Проблема, с которой я застрял, связана с флажком в DataGrid (WPF)

нажмите на эту ссылку, я хочу сделать то же самое, как это Мой код XAML:

<DataGrid x:Name="DgLines" ItemsSource="{Binding OpcUaEndpoints}"
          MouseDoubleClick="DgLines_MouseDoubleClick" SelectionMode="Extended"  
          DataContext="{Binding}"  IsReadOnly="True" Grid.ColumnSpan="5">
    <DataGrid.Columns>
        <DataGridTemplateColumn
            <DataGridTemplateColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox Name="ckbSelectedAll"  Checked="ckbSelectedAll_Checked" Unchecked="ckbSelectedAll_Unchecked"
                              IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"></CheckBox>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Name="cbkSelect" Checked="cbkSelect_Checked" Unchecked="cbkSelect_Unchecked"
                              IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <!--<DataGridTextColumn Width="200" Header="Id" Binding="{Binding Id }" />-->

        <DataGridTextColumn Width="200" Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Width="500" Header="Description" Binding="{Binding Description}"/>
        <DataGridTextColumn Width="500" Header="Lines" Binding="{Binding Endpoint}"/>
    </DataGrid.Columns>
</DataGrid>

ViewModelCode:

private void ckbSelectedAll_Unchecked(object sender, RoutedEventArgs e)
{
    //  this.DgLines.UnselectAll();
    foreach (AddLinesViewModel c in DgLines.ItemsSource)
    {
        c.IsSelected = false;
    }
}

private static OpcUaEndpointsListViewModel _instance;
private static readonly object Padlock = new object();
private ICommand _addCommand;
private ICommand _uncheckCommand;
private ICommand _searchcommand;
private ObservableCollection<AddOpcUaEndpointsViewModel> _endpoint;
public string _charNameFromTB;

public OpcUaEndpointsListViewModel()
{
    BindDataGrid();
}

public static OpcUaEndpointsListViewModel Instance
{
    get
    {
        lock (Padlock)
        {
            return _instance ?? (_instance = new OpcUaEndpointsListViewModel());
        }
    }
}

/// <summary>
///     //OPC UA Endpoint List
/// </summary>
public ObservableCollection<AddOpcUaEndpointsViewModel> OpcUaEndpoints
{
    get => _endpoint;
    set
    {
        if (OpcUaEndpoints == value)
        {
            _endpoint = value;
            OnPropertyChanged("OpcUaEndpoints");
        }
    }
}

public string CharNameFromTB
{
    get { return _charNameFromTB; }
    set
    {
        _charNameFromTB = value;
        OnPropertyChanged("CharNameFromTB");
    }
}

public ICommand AddCommand
{
    get { return _addCommand ?? (_addCommand = new RelayCommand(p => ExecuteAddCommand())); }
}

public ICommand SearchCommand
{
    get { return _searchcommand ?? (_searchcommand = new RelayCommand(p => ExecuteSearchCommand())); }
}

private void ExecuteSearchCommand()
{
    BindDataGridsearch();
}

private void BindDataGrid()
{
    var opcendptsModel = opcUaEndpointsService.GetAll();
    _endpoint = new ObservableCollection<AddOpcUaEndpointsViewModel>(opcendptsModel.Select(p => new AddOpcUaEndpointsViewModel(p)));
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Пожалуйста, найдите рабочий код. Я сделал некоторые изменения в вашем коде

    <DataGrid x:Name="DgLines" ItemsSource="{Binding OpcUaEndpoints}" AutoGenerateColumns="False"
                     SelectionMode="Extended"  IsReadOnly="True" Grid.ColumnSpan="5">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn>
                                <DataGridTemplateColumn.HeaderTemplate>
                                <DataTemplate>
                                    <CheckBox Name="ckbSelectedAll" 
                                          IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}">
                                            <i:Interaction.Triggers>
                                                <i:EventTrigger EventName="Checked" >
                                                    <i:InvokeCommandAction Command="{Binding DataContext.CheckedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
                                                </i:EventTrigger>
                                                <i:EventTrigger EventName="Unchecked" >
                                                    <i:InvokeCommandAction Command="{Binding DataContext.UncheckedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
                                                </i:EventTrigger>
                                            </i:Interaction.Triggers>
                                        </CheckBox>
                                </DataTemplate>
                                </DataGridTemplateColumn.HeaderTemplate>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox Name="cbkSelect" 
                                          IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

                            <!--<DataGridTextColumn Width="200" Header="Id" Binding="{Binding Id }" />-->

                            <DataGridTextColumn Width="200" Header="Name" Binding="{Binding Name}"/>
                            <DataGridTextColumn Width="500" Header="Description" Binding="{Binding Description}"/>
                            <DataGridTextColumn Width="500" Header="Lines" Binding="{Binding Endpoint}"/>
                        </DataGrid.Columns>
                    </DataGrid>


        public class OpcUaEndpointsListViewModel : INotifyPropertyChanged
            {
                private static OpcUaEndpointsListViewModel _instance;
                private static readonly object Padlock = new object();
                private ICommand _addCommand;
                //private ICommand _uncheckCommand;
                private ICommand _searchcommand;
                private ICommand _checkedCommand { get; set; }
                private ICommand _unCheckedCommand { get; set; }

                private ObservableCollection<AddOpcUaEndpointsViewModel> _endpoint;
                public string _charNameFromTB;

                public event PropertyChangedEventHandler PropertyChanged;

                public OpcUaEndpointsListViewModel()
                {
                    BindDataGrid();
                }

                public static OpcUaEndpointsListViewModel Instance
                {
                    get
                    {
                        lock (Padlock)
                        {
                            return _instance ?? (_instance = new OpcUaEndpointsListViewModel());
                        }
                    }
                }

                /// <summary>
                ///     //OPC UA Endpoint List
                /// </summary>
                public ObservableCollection<AddOpcUaEndpointsViewModel> OpcUaEndpoints
                {
                    get { return _endpoint; }
                    set
                    {
                        if (OpcUaEndpoints == value)
                        {
                            _endpoint = value;
                            OnPropertyChanged("OpcUaEndpoints");
                        }
                    }
                }

                public string CharNameFromTB
                {
                    get { return _charNameFromTB; }
                    set
                    {
                        _charNameFromTB = value;
                        OnPropertyChanged("CharNameFromTB");
                    }
                }

                public ICommand AddCommand
                {
                    get { return _addCommand ?? (_addCommand = new WpfApplication1.RelayCommand<object>(p => ExecuteAddCommand())); }
                }

                public ICommand SearchCommand
                {
                    get { return _searchcommand ?? (_searchcommand = new RelayCommand<object>(p => ExecuteSearchCommand())); }
                }


                public ICommand CheckedCommand
                {
                    get { return _checkedCommand ?? (_checkedCommand = new WpfApplication1.RelayCommand<object>(p => ExecuteCheckedCommand())); }
                }
                public ICommand UncheckedCommand
                {
                    get { return _unCheckedCommand ?? (_unCheckedCommand = new WpfApplication1.RelayCommand<object>(p => ExecuteUnCheckedCommand())); }
                }


                private void ExecuteSearchCommand()
                {
                    ///BindDataGridsearch();
                }

                private void ExecuteCheckedCommand()
                {
                    foreach (var item in _endpoint)
                    {
                        item.IsSelected = true;
                    }
                }

                private void ExecuteUnCheckedCommand()
                {
                    foreach (var item in _endpoint)
                    {
                        item.IsSelected = false;
                    }
                }

                private void ExecuteAddCommand()
                {
                    ///BindDataGridsearch();
                }

                private void BindDataGrid()
                {
                    _endpoint = new ObservableCollection<AddOpcUaEndpointsViewModel>();
                    _endpoint.Add(new AddOpcUaEndpointsViewModel { Name = "A", Description = "A", Endpoint = 1 });
                    _endpoint.Add(new AddOpcUaEndpointsViewModel { Name = "B", Description = "B", Endpoint = 2 });
                    _endpoint.Add(new AddOpcUaEndpointsViewModel { Name = "C", Description = "C", Endpoint = 3 });
                    _endpoint.Add(new AddOpcUaEndpointsViewModel { Name = "D", Description = "D", Endpoint = 4 });
                    _endpoint.Add(new AddOpcUaEndpointsViewModel { Name = "E", Description = "E", Endpoint = 5 });
                }

                public void OnPropertyChanged(string propertyName)
                {
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
                }
            }

public class AddOpcUaEndpointsViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; OnPropertyChanged("Name"); }
        }

        private string _description;

        public string Description
        {
            get { return _description; }
            set { _description = value; OnPropertyChanged("Description"); }
        }

        private int _endPoint;

        public int Endpoint
        {
            get { return _endPoint; }
            set { _endPoint = value; OnPropertyChanged("Endpoint"); }
        }

        private bool _isSelected;

        public bool IsSelected
        {
            get { return _isSelected; }
            set { _isSelected = value; OnPropertyChanged("IsSelected"); }
        }
    }
0 голосов
/ 10 сентября 2018

Определения столбцов DataGrid не наследуют DataContext, поскольку они не являются частью визуального дерева.

Вам придется использовать BindingProxy ¹, чтобы обойти это.

<DataGrid.Resources>
    <attached:BindingProxy x:Key="proxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGridTemplateColumn>
    <DataGridTemplateColumn.Header>
        <CheckBox IsChecked="{Binding Data.IsHeaderCheckBoxChecked, Source={StaticResource proxy}}"/>
    </DataGridTemplateColumn.Header>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

BindingProxy

public class BindingProxy : Freezable
{
    #region XAML Properties

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register(nameof(Data), typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));

    public object Data
    {
        get { return GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    #endregion

    #region Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion
}

Также помните, что в вашей виртуальной машине нет элементов управления пользовательским интерфейсом и нет XXX_Clicked обработчика или подобного. При необходимости они принадлежат файлу с выделенным кодом (* .xaml.cs).


¹ Вы также можете проверить этот вопрос.

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