我正在尝试使用<StackPanel>
事件将控件添加到<DataGrid>
中的LoadingRowDetails
中。但是只要我在控件外部单击,它就会消失。
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看到它
答案 0 :(得分:1)
进入单元格的编辑模式时,CheckBox
被删除。您可以通过将IsReadOnly
属性设置为true
来防止这种情况的发生:
<DataGridTemplateColumn Header="Checkbox" Width="225" IsReadOnly="True">
请注意,由于UI虚拟化和容器回收,通过获取对构成DataGrid的可视元素的引用来添加控件通常不是一个好主意。