我知道我可以使用以下代码将一个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
中实现绑定?
答案 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)));
}
}
}