我有一个DataGrid,其RowDetails设置为在选中时显示(RowDetailsVisibilityMode =“VisibleWhenSelected”)。现在我希望能够摆脱它!我用这段代码在行细节上放了一个关闭按钮:
private void Button_Click(object sender, RoutedEventArgs e)
{
e.Handled = true;
Button button = sender as Button;
DataGridRow row = button.FindAncestor<DataGridRow>();
row.DetailsVisibility = Visibility.Collapsed;
}
该代码在那里得到了90%,但是一旦给定行的行细节折叠,下一次选择该行时就不会出现。
答案 0 :(得分:12)
我也遇到过这种情况。这是一个解决方案:
将该按钮保留在RowDetails中并稍微更改其代码。不要关注单个行的可见性,而是将DataGrid的SelectedIndex属性设置为-1(未选中)。
DataGrid1.SelectedIndex = -1;
由于您的RowDetailsVisibilityMode为VisibleWhenSelected
,因此DataGrid将折叠/隐藏任何展开的RowDetails。当SelectionMode为Single
时,这很有效。
答案 1 :(得分:6)
您可以使用XAML中的以下代码实现此目的:
<WpfToolkit:DataGrid Name="dgSysthetic" ItemsSource="{Binding}"
AutoGenerateColumns="True"
SelectionMode="Extended"
RowDetailsVisibilityMode="Collapsed"
CanUserAddRows="False" CanUserDeleteRows="False"
CanUserResizeRows="False" CanUserSortColumns="False"
RowHeaderWidth="20" RowHeight="25">
<WpfToolkit:DataGrid.RowHeaderTemplate>
<DataTemplate>
<Button Name="btnHideRow" Click="btnHideDetails_Click" FontSize="5">></Button>
</DataTemplate>
</WpfToolkit:DataGrid.RowHeaderTemplate>
<WpfToolkit:DataGrid.RowDetailsTemplate>
<DataTemplate>
<WpfToolkit:DataGrid Name="dgAnalytical" ItemsSource="{Binding}" AutoGenerateColumns="True"/>
</DataTemplate>
</WpfToolkit:DataGrid.RowDetailsTemplate>
</WpfToolkit:DataGrid>
请参阅RowHeaderTemplate内的按钮。
在您的C#代码中,您可以这样做:
private void btnHideDetails_Click(object sender, RoutedEventArgs e)
{
DependencyObject obj = (DependencyObject)e.OriginalSource;
while (!(obj is DataGridRow) && obj != null) obj = VisualTreeHelper.GetParent(obj);
if (obj is DataGridRow)
{
if ((obj as DataGridRow).DetailsVisibility == Visibility.Visible)
{
(obj as DataGridRow).DetailsVisibility = Visibility.Collapsed;
}
else
{
(obj as DataGridRow).DetailsVisibility = Visibility.Visible;
}
}
}
这对我很有用。
答案 2 :(得分:3)
你可以将它作为你的按钮点击事件,它向上走,树找到数据行并在需要的地方设置细节。
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep != null && dep is DataGridRow)
{
DataGridRow row = dep as DataGridRow;
if (row.DetailsVisibility == Visibility.Collapsed)
{
row.DetailsVisibility = Visibility.Visible;
}
else
{
row.DetailsVisibility = Visibility.Collapsed;
}
}
答案 3 :(得分:1)
尝试在row.DetailsVisibility = Visibility.Visible;
事件上添加RowDetailsVisibilityChanged
。
答案 4 :(得分:1)
尝试使用设置Button的Command,CommandParameter属性的Setter在Button上设置样式。您需要创建一个支持ICommand的类,并将其作为XAML中的StaticResource包含在内。在这里,我使用DataGridRowHeader作为按钮而不是行详细信息中的按钮。
<local:DeselectRowCommand x:Key='deselectCommand' />
<Setter Property='Command' Value='{StaticResource deselectCommand}' />
<Setter Property='CommandParameter'
Value='{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=wpf:DataGridRow}}' />
在命令的Execute方法中,您可以从命令参数获取DataGridRow并应用您需要的任何方法。
至少通过这种方式,您可以共享此样式或将其他样式用于其他样式,并将ICommand重新用于其他DataGrids,并减少事件处理。
您可以在this Silverlight-to-WPF DataGrid开源项目中看到一个工作示例。
答案 5 :(得分:0)
试试这个(在XAML中将PreviewMouseDown事件添加到DataGrid中):
private void UIElement_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
DataGrid grid = sender as DataGrid;
if (grid != null)
{
FrameworkElement element = e.OriginalSource as FrameworkElement;
if (element?.DataContext is FixedIncomeOrder)
{
if (grid.SelectedItem == (FixedIncomeOrder) ((FrameworkElement) e.OriginalSource).DataContext)
{
grid.SelectedIndex = -1;
e.Handled = true;
}
}
}
}
答案 6 :(得分:0)
确保您的数据网格具有名称,例如
<DataGrid x:Name="dgPrimary"
...>
在行模板中放置一个按钮,例如
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Button Content="X" Click="Button_Click" Width="20"/>
....
然后在代码隐藏中,只需将datagrid的选定索引设置为-1
private void Button_Click(object sender, RoutedEventArgs e)
{
dgPrimary.SelectedIndex = -1;
}