C # WPF включить управление на основе значения CheckBox - PullRequest
0 голосов
/ 15 февраля 2019

Я знаю, что могу связать элемент управления, скажем TextBox со значением CheckBox, используя следующий код:

<CheckBox Name="cb1" />
<TextBox IsEnabled="{Binding ElementName=cb1, Path=IsChecked}" />

Как я могу сделать то же самое в DataGrid?

У меня есть DataGrid:

<DataGrid Name="xDataGridName" >
    <DataGrid.Columns>

        <DataGridTemplateColumn Header="Enable">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                   <flatcheckbox:FlatCheckBox x:Name="xDGCheck" Margin="0" IsChecked="{Binding Path=Enabled, Mode=TwoWay}" />
                </DataTemplate>                                              
            </DataGridTemplateColumn.CellTemplate>

            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <flatcheckbox:FlatCheckBox x:Name="xDGCheck" Margin="0" IsChecked="{Binding Path=Enabled, Mode=TwoWay}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>



        <DataGridTemplateColumn Header="Group">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                   <TextBlock Name="xTextBlockName" Text="{Binding Path=Group}" />
                </DataTemplate>                                              
            </DataGridTemplateColumn.CellTemplate>

            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>

                    <!-- this is always enabled, i want it to be enable only when checkbox is checked -->    
                    <TextBlock Name="xTextBlockName" Text="{Binding Path=Group}" IsEnabled="{Binding ElementName=xDGCheck, Path=IsChecked}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

    </DataGrid.Columns>
</DataGrid>

Как реализовать привязку в DataGrid?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Поскольку у вас уже есть свойство Enabled, связанное с вашим CheckBox, вы можете использовать его, чтобы связать его со свойством IsEnabled вашего TextBox.Ваше связывание CheckBox должно иметь UpdateSourceTrigger значение PropertyChanged Рабочий образец ниже,

XAML

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Enable">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Group">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Group}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>

            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Group}" IsEnabled="{Binding Path=Enabled, Mode=TwoWay}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Модель

public class Model : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _enabled;
    private string _group;

    public bool Enabled
    {
        get => _enabled; set
        {
            _enabled = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Enabled)));
        }
    }

    public string Group
    {
        get { return _group; }
        set
        {
            _group = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Group)));
        }
    }
}

ViewModel

public class ViewModel
{
    public ObservableCollection<Model> Items { get; set; }
    public ViewModel()
    {
        Items = new ObservableCollection<Model>
        {
            {new Model{ Enabled = true, Group = "Group1"} },
            {new Model{ Enabled = false, Group = "Group2"} },
            {new Model{ Enabled = false, Group = "Group3"} },
            {new Model{ Enabled = true, Group = "Group4"} },
            {new Model{ Enabled = false, Group = "Group5"} },
            {new Model{ Enabled = false, Group = "Group6"} }
        };
    }
}
0 голосов
/ 15 февраля 2019

Вам следует привязать к свойству Enabled source вместо привязки к свойству IsChecked CheckBox:

<TextBlock Name="xTextBlockName" Text="{Binding Path=Group}" IsEnabled="{Binding Enabled}"/>

Свойство Enabled вашего класса данных задаетсяCheckBox, поэтому оно всегда должно иметь то же значение, что и свойство IsChecked CheckBox.

Убедитесь, что ваш объект данных - класс, в котором определено свойство Enabled - реализует Интерфейс INotifyPropertyChanged и вызовите событие PropertyChanged для свойства Enabled, когда оно установлено CheckBox.

Как указано @Hyarus, вы также должны установить UpdateSourceTrigger to PropertyChanged, чтобы свойство источника было установлено немедленно:

<flatcheckbox:FlatCheckBox x:Name="xDGCheck" Margin="0" IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...