WPF datagrid, зависимость ячейки DataGridCheckBoxColumn от DataGridComboBoxColumn

Есть datagrid, который состоит из 2 колонок: первая - выпадающий список с элементами 1,2,3; и вторая - checkbox. Как чекбоксу задать isEnable = False если в выпадающем списке выбрано 1


Ответы (1 шт):

Автор решения: EvgeniyZ

По сути задача очень простая и все тут зависит от того, как грамотно у вас сделано приложение, используются привязки и так далее.

Если по уму, то должен быть отдельный класс, который будет иметь информацию про одну строку в таблице, нечто на подобие этого:

public class Item : NotifyBase
{
    public List<int> Items { get; } = new List<int> { 1, 2, 3 };

    private int selectedItem;
    public int SelectedItem
    {
        get => selectedItem;
        set
        {
            IsEnabled = value != 1;
            selectedItem = value;
        }
    }

    private bool isEnabled = true;
    public bool IsEnabled 
    {
        get => isEnabled;
        set => SetField(ref isEnabled, value);
    }
    public bool IsSelected { get; set; }
}

Это очень упрощенный вид и пару нюансов тут есть, но для примера сойдет. Логика думаю вам понятна, мы имеет некое свойство SelectedItem, которое будет обновляться каждый раз, когда будет выбрано новое значение в ComboBox, а зная тот факт, что у свойств есть get (когда кто либо хочет получить данные из него) и set (когда кто либо хочет данные в него установить), то мы можем чуть переписать set, указав в нем простейшую логику с проверкой нового значения.
Так, как меняется свойство из кода (я про IsEnabled = ...), то нам надо сказать интерфейсу про это, оповестить его и для этих целей есть INotifyPropertyChanged, который и вызывается в set нужного свойства. Сама же реализация INotifyPropertyChanged бывает разная, я использую эту:

public class NotifyBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;
    protected void OnPropertyChanged(string? propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }
}

Собственно вот и все, что надо для решения такой задачи, как у вас. Остается только сделать коллекцию для привязки, задать DataContext из которого XAML будет получать данные, ну и написать простенький интерфейс.
Я буду писать все прям в окне, но вам советую сделать отдельный класс для таких целей, окно же должно быть чистым!

public partial class MainWindow : Window
{
    public List<Item> Items { get; } = new List<Item>
    {
        new Item(),
        new Item(),
        new Item(),
        new Item(),
        new Item(),
    };

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

Ну и XAML:

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Значение" >
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Items}" />
                    <Setter Property="SelectedItem" Value="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" />
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Items}" />
                    <Setter Property="SelectedItem" Value="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" />
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
        </DataGridComboBoxColumn>
        <DataGridCheckBoxColumn Header="Выбрано">
            <DataGridCheckBoxColumn.ElementStyle>
                <Style TargetType="CheckBox">
                    <Setter Property="IsChecked" Value="{Binding IsSelected}"/>
                    <Setter Property="IsEnabled"  Value="{Binding IsEnabled}"/>
                </Style>
            </DataGridCheckBoxColumn.ElementStyle>
        </DataGridCheckBoxColumn>
    </DataGrid.Columns>
</DataGrid>

Ненавижу этот компонент, заставляет кучу лишнего писать, так что если знаете как лучше - дерзайте, я лишь написал на быструю руку.
Тут все довольно просто, мы делаем таблицу, привязываем ее к Items свойству, ну и делаем две колонки, где первая отображает список из цифр, а вторая это CheckBox.

Запускаем и видим то, что наша логика успешно отработала

Result

Как видите все довольно просто, удачи в изучении!

→ Ссылка