WPF-DataGrid-动态添加的控件在单击其他任何位置时都会消失

时间:2018-06-27 08:10:31

标签: c# wpf wpfdatagrid

我正在尝试使用<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 Tutorial学习WPF控件,并从那里获取了示例代码并对其进行了一些修改

作为当前代码,您可以here看到它

1 个答案:

答案 0 :(得分:1)

进入单元格的编辑模式时,CheckBox被删除。您可以通过将IsReadOnly属性设置为true来防止这种情况的发生:

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

请注意,由于UI虚拟化和容器回收,通过获取对构成DataGrid的可视元素的引用来添加控件通常不是一个好主意。