Как получить доступ к элементу, определенному в DataGrid RowHeaderTemplate или DataGrid.RowHeaderSyle - PullRequest
0 голосов
/ 14 февраля 2019

I следующий код

<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>

Как я могу получить доступ к SelectedItemCheckBox из кода сзади при выборе строки?

Что у меня есть такfar:

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

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

ItemSource of MyGrid установлен в коде позади, обычно я получаю доступ к ячейке, обращаясь к MyGrid.Columns [], однако это заголовок строки и он не является частью Columns [].

Обратите внимание, что есть много строк с этим флажком, определенным в зависимости от размера ItemSource.

Также я хотел бы знать, есть ли способ получить доступ к флажку без изменения xaml и использования его какэто так.

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы хотите получить доступ к флажку заголовка строки в своем коде (и не использовать привязку), вы можете «перемещаться» по визуальному дереву выбранного вами 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 здесь доступно несколько вариантов: Как найти элементы управления WPF по имени или типу?

В этом примере я использовал следующее: Как найти элементы управления WPF по имени или типу?

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...