如何访问DataGrid RowHeaderTemplate或DataGrid.RowHeaderSyle中定义的元素

问题描述 投票:0回答:1

我是以下代码

<DataGrid.RowHeaderTemplate >
    <DataTemplate>
        <CheckBox x:Name="SelectedItemCheckBox"
                    Margin="5 0 0 0"
                    IsChecked="{Binding Path=IsSelected,
                                        Mode=TwoWay,
                                        RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}}}">
        </CheckBox>
    </DataTemplate>
</DataGrid.RowHeaderTemplate>

要么

<DataGrid.RowHeaderStyle>
    <Style TargetType="{x:Type DataGridRowHeader}">
        <Setter Property="Background" Value="White"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                    <CheckBox x:Name="SelectedItemCheckBox"
                                Margin="5 0 0 0"
                                IsChecked="{Binding Path=IsSelected,
                                                    Mode=TwoWay,
                                                    RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}}}">
                    </CheckBox>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.RowHeaderStyle>

当选择行时,如何从后面的代码访问Selected Item CheckBox?

到目前为止我所拥有的:

private CheckBox GetCheckbox(int index)
{
    DataGridRow row = (DataGridRow)MyGrid.ItemContainerGenerator.ContainerFromIndex(index);

    //how do I get to that checkbox here ?
}

MyGrid的ItemSource设置在代码后面,通常我会通过访问MyGrid.Columns []访问单元格,但这是一个行标题,它不是Columns []的一部分。

请注意,根据ItemSsource大小,有许多行定义了此复选框。

另外我想知道是否有办法访问复选框而不更改xaml并按原样使用它。

c# wpf xaml
1个回答
1
投票

如果要访问代码隐藏中的行标题复选框(而不是使用绑定),则可以“移动”所选DataGridRow的可视树以查找标题。

将SelectionChanged事件处理程序添加到DataGrid:

<DataGrid x:Name="Grid" Loaded="Grid_Loaded" SelectionChanged="Grid_SelectionChanged">

然后在代码隐藏中:

  1. 获取所选行
  2. 使用VisualTreeHelper查找标题的复选框
  3. 做你的魔法 private void Grid_SelectionChanged(object sender, SelectionChangedEventArgs e) { var item = (DataGridRow)Grid.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]); var control = FindChild<CheckBox>(item, "SelectedItemCheckBox"); control.IsChecked = true; }

对于FindChild,这里有多个选项:How can I find WPF controls by name or type?

我在这个例子中使用了以下内容:How can I find WPF controls by name or type?

public static T FindChild<T>(DependencyObject depObj, string childName)
   where T : DependencyObject
{
    // Confirm obj is valid. 
    if (depObj == null) return null;

    // success case
    if (depObj is T && ((FrameworkElement)depObj).Name == childName)
        return depObj as T;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(depObj, i);

        //DFS
        T obj = FindChild<T>(child, childName);

        if (obj != null)
            return obj;
    }

    return null;
}
© www.soinside.com 2019 - 2024. All rights reserved.