【问题标题】:control RadioButton DataGridTemplateColumn from code从代码中控制 RadioButton DataGridTemplateColumn
【发布时间】:2012-05-11 16:35:02
【问题描述】:

我有一个数据网格,其中包含 3 个包含单选按钮的 DataGridTemplateColumns。 现在我想通过后面代码中按钮的单击事件来控制 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 和许多其他教程/博客文章,但无法使其工作。 有什么想法吗?

【问题讨论】:

    标签: c# wpf wpfdatagrid


    【解决方案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 为真或假。此更改应传播到属于此 DataGridColumn 的每个 DataGridCell,然后由于绑定而更改 RadioButton.IsEnabled。

    XAML sn-p 使用 BooleanOppositeConverter,它只是一个反转布尔值的转换器。

    【讨论】:

      【解决方案2】:

      要确保您的 readiobutton 是 ReadOnly 是设置 IsHitTestVisible

      <DataGridTemplateColumn ...>
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <RadioButton ....IsHitTestVisible="False"/>             
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多