【问题标题】:C# WPF enable control based on CheckBox valueC# WPF 根据 CheckBox 值启用控件
【发布时间】:2025-12-29 01:20:12
【问题描述】:

我知道我可以使用以下代码将一个控件(例如 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 中实现绑定?

【问题讨论】:

  • 什么是FlatCheckBox?可以用通常的CheckBox 替换,还是对问题很重要?
  • 您绑定到Enabled 源属性。
  • 如果您要将状态传播到 VM 中,为什么不只是 IsEnabled="{Binding Path=Enabled}
  • @Vlad FlatCheckBox 只是一个应用了自定义样式的复选框。我将它绑定到复选框值(而不是 Enabled ),因为我希望在选中/取消选中复选框时立即启用/禁用文本框。将其绑定到启用,我必须选中复选框,失去该行的焦点,然后文本框才会启用,反之亦然
  • @mrid 我认为这是真正需要解决的问题。您是否尝试指定 UpdateSourceTrigger? IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

标签: c# wpf xaml data-binding datagrid


【解决方案1】:

您应该绑定到Enabled 源属性,而不是绑定到CheckBoxIsChecked 属性:

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

数据类的Enabled 属性由CheckBox 设置,因此它应始终与CheckBoxIsChecked 属性具有相同的值。

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

正如@Hyarus 所指出的,您还应该将UpdateSourceTrigger 设置为PropertyChanged,以便立即设置源属性:

<flatcheckbox:FlatCheckBox x:Name="xDGCheck" Margin="0" IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

【讨论】:

  • @mrid:我不明白。您的 CheckBox 绑定到一个名为 Enabled 的源属性,不是吗?如果没有,应该是。
  • 这就是正在发生的事情:drive.google.com/drive/folders/…
  • 请更新您的问题,而不是提供指向 Google 云端硬盘的链接。顺便问一下,你看到我最后的编辑了吗?
  • +1 但我认为您需要将 UpdateSourceTrigger=PropertyChanged 添加到复选框(或两者)。这是复选框没有更新属性的问题,而不是获取更新的文本块。
【解决方案2】:

由于您已经将Enabled 属性与CheckBox 绑定,因此您可以使用相同的属性将其与TextBoxIsEnabled 属性绑定。您的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)));
        }
    }
}

视图模型

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

【讨论】: