我有一个数据网格,其中包含3个DataGridTemplateColumns,其中包含radioButtons。 现在我想通过代码后面的按钮的单击事件来控制radioButtons的“isEnabled”属性:
<DataGrid AutoGenerateColumns="False" Height="300" x:Name="dgEmps"
RowEditEnding="gridEmps_RowEditEnding" CellEditEnding="gridEmps_CellEditEnding"
FlowDirection="RightToLeft"
SelectionChanged="gridEmps_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Shift Manager">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="{Binding EmployeeId}"
IsChecked="{Binding IsManager, Mode=TwoWay}" x:Name="dgrIsManager"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Waiter" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="{Binding EmployeeId}"
IsChecked="{Binding IsWaiter, Mode=TwoWay}" x:Name="dgrIsWaiter"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Cook" IsReadOnly="True" x:Name="aaa">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="{Binding EmployeeId}"
IsChecked="{Binding IsCook, Mode=TwoWay}" x:Name="dgrIsCook"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
问题是“IsReadOnly”属性不起作用,我似乎无法从我的代码访问radioButton属性(甚至不是我在xaml中声明的x:name)。 我试过这个: WPF Toolkit DataGrid SelectionChanged Getting Cell Value 和许多其他教程/博客文章,但无法使其工作。 任何想法?
答案 0 :(得分:1)
您不能通过x:Name访问RadioButton,因为它是在DataTemplate中定义的,而不是在主内容树中定义的。
而是像这样定义DataTemplateColumns(基于你的上一栏):
<DataGridTemplateColumn Header="Cook" IsReadOnly="True" x:Name="aaa">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="{Binding EmployeeId}"
IsChecked="{Binding IsCook, Mode=TwoWay}" x:Name="dgrIsCook"
IsEnabled={Binding IsReadOnly, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Converter={StaticResource BooleanOppositeConverter}}/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
然后从代码后面设置aaa.IsReadOnly为true或false。此更改应传播到属于此DataGridColumn的每个DataGridCell,然后由于绑定而更改RadioButton.IsEnabled。
XAML片段使用BooleanOppositeConverter,它只是一个反转布尔值的转换器。
答案 1 :(得分:0)
确保您的readiobutton是ReadOnly是设置IsHitTestVisible
<DataGridTemplateColumn ...>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton ....IsHitTestVisible="False"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>