基于CheckBox值的C#WPF启用控件

时间:2019-02-15 09:51:31

标签: c# wpf xaml data-binding datagrid

我知道我可以使用以下代码将一个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 :(得分:2)

您应该绑定到Enabled的源属性,而不是绑定到IsChecked的{​​{1}}的属性:

CheckBox

数据类的<TextBlock Name="xTextBlockName" Text="{Binding Path=Group}" IsEnabled="{Binding Enabled}"/> 属性是由Enabled设置的,因此它应始终与CheckBox的{​​{1}}属性具有相同的值。

请确保您的数据对象(定义了IsChecked属性的类)实现了INotifyPropertyChanged interface,并在CheckBox属性引发Enabled事件由PropertyChanged设置。

@Hyarus指出,您还应该将Enabled设置为CheckBox,以便立即设置源属性:

UpdateSourceTrigger

答案 1 :(得分:0)

由于您已经将Enabled属性与CheckBox绑定在一起,因此可以将其与IsEnabled的{​​{1}}属性绑定在一起。您的TextBox绑定应将CheckBox设置为下面的UpdateSourceTrigger工作示例,

XAML

PropertyChanged

模型

<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>

ViewModel

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)));
        }
    }
}