WPF - DataGrid - динамически добавленные элементы управления исчезают при нажатии в другом месте - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь добавить элементы управления к <StackPanel> в <DataGrid>, используя событие LoadingRowDetails. Но всякий раз, когда я нажимаю вне элемента управления, он исчезает.

enter image description here

MainWindow.xaml

<DataGrid 
    ItemsSource="{Binding Customers}" 
    AutoGenerateColumns="False" 
    SelectionMode="Single" 
    SelectionUnit="Cell"
    LoadingRowDetails="manualGrid_LoadingRowDetails"
    RowDetailsVisibilityMode="Visible"
    x:Name="manualGrid"
            >
    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
        <DataGridTemplateColumn Header="Image" Width="SizeToCells" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Height="80" Source="{Binding Image}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Checkbox" Width="225">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel VerticalAlignment="Top" Margin="5,0,0,0" HorizontalAlignment="Center" Orientation="Horizontal">
                        <Label Content="Test" Visibility="Collapsed" />
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Border BorderBrush="Black" Width="1">
                <StackPanel x:Name="spTest1" />
            </Border>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

MainWindow.xaml.cs

public MainWindow()
{
    InitializeComponent();
    DataContext = new MainWindowViewModel();
}

private void manualGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
    try
    {
        DataGridRow row = (DataGridRow)manualGrid.ItemContainerGenerator.ContainerFromIndex(e.Row.GetIndex());

        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(2);
        StackPanel stackValue = GetVisualChild<StackPanel>(cell);
        CheckBox ChkBox = new CheckBox();
        ChkBox.IsChecked = true;
        ChkBox.Margin = new Thickness(0, 7, 0, 0);
        if (stackValue.Children.Count == 1)
            stackValue.Children.Add(ChkBox);
    }
    catch (Exception)
    {

        throw;
    }
}

public static T GetVisualChild<T>(Visual parent) where T : Visual
{
    T child = default(T);
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
            child = GetVisualChild<T>(v);
        }
        if (child != null)
        {
            break;
        }
    }
    return child;
}

Что мне здесь не хватает?

Примечание: я только изучаю элементы управления WPF из Учебное пособие по WPF , получил оттуда пример кода и немного его изменил

Как текущий код, вы можете увидеть его здесь

1 Ответ

0 голосов
/ 27 июня 2018

CheckBox удаляется при входе в режим редактирования ячейки. Вы можете предотвратить это, установив для свойства IsReadOnly значение true:

<DataGridTemplateColumn Header="Checkbox" Width="225" IsReadOnly="True">

Обратите внимание, что добавление элементов управления путем получения ссылок на визуальные элементы, составляющие DataGrid, как правило, является плохой идеей из-за виртуализации пользовательского интерфейса и переработки контейнеров.

...