从代码控制RadioButton DataGridTemplateColumn

时间:2012-05-02 07:52:02

标签: c# wpf wpfdatagrid

我有一个数据网格,其中包含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 和许多其他教程/博客文章,但无法使其工作。 任何想法?

2 个答案:

答案 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>
相关问题