gpt4 book ai didi

WPF DataGrid - 使用复选框隐藏列

转载 作者:行者123 更新时间:2023-12-04 08:17:20 26 4
gpt4 key购买 nike

我正在尝试使用复选框(在 WPF 4.0 中)来控制列的可见性。

这是我的 XAML 的片段:

<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>

<CheckBox x:Name="GeneralDetailsVisible" Content="General Details" Margin="5"/>

<DataGridTextColumn Header="Crew"
Binding="{Binding Path=Crew}"
Visibility="{Binding ElementName=GeneralDetailsVisible,
Converter={StaticResource BoolToVisConverter},
Path=IsChecked}">
</DataGridTextColumn>

现在我知道 BooleanToVisibilityConverter 转换器正在工作,因为我将它绑定(bind)到一个文本 block ,我可以看到我期望的值。如果我手动将值输入到列可见性属性中,它就可以工作。但不是当我绑定(bind)它时。我究竟做错了什么?

答:

Quartermeister 向我指出了答案。他指向的页面有点误导,因为帖子中列出的代码不起作用,您必须查看示例代码。

对于遇到此问题的其他人,这是我的最终工作代码:

转换器将我们的 ViewModels bool 属性转换为我们的列属性的正确可见性值。
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>

将复选框绑定(bind)到将控制列可见性的 ViewModels 属性。
<CheckBox
x:Name="DetailsVisible"
Content="Show Details"
IsChecked="{Binding Path=DisplayDetails}" />

然后将 Visibility 绑定(bind)到 ViewModels DisplayDetails 属性。请注意,绑定(bind)到的是列自己的 DataContext。
<DataGridTextColumn
Header="Reliability"
Binding="{Binding Path=Reliability}"
Visibility="{Binding (FrameworkElement.DataContext).DisplayDetails,
RelativeSource={x:Static RelativeSource.Self},
Converter={StaticResource BoolToVisConverter}}">
</DataGridTextColumn>

将以下代码添加到您的项目中,这允许捕获 DataGrids DataContext 中的更改。
FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));

FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid),
new FrameworkPropertyMetadata
(null, FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(OnDataContextChanged)));

然后,每当您的 DataGrids DataContext 发生更改时,我们都会使用新的 DataContext 更新所有附加的 DataGridColumsn。
public static void OnDataContextChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
DataGrid grid = d as DataGrid;
if (grid != null)
{
foreach (DataGridColumn col in grid.Columns)
{
col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);
}
}
}

一个需要注意的问题。如果您像这样将 DataContext 添加到您的页面:
<Window.DataContext>
<vm:WeaponListViewModel />
</Window.DataContext>

然后上面的函数将在你的 DataGrid 有任何列之前被调用!

在创建窗口后,我通过在后面的代码中手动附加我的 DataConext 来解决这个问题。

最佳答案

IMO 使用 x:Name , x:ReferenceSource更简单:

<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

<CheckBox x:Name="showImperial" Content="Show Details" />

<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="TOV (Bls)"
Width="80"
Binding="{Binding TOVBarrels}"
Visibility="{Binding Source={x:Reference showImperial},
Path=IsChecked,
Converter={StaticResource BooleanToVisibilityConverter}}"/>
</DataGrid.Columns>
</DataGrid>

看到这个答案:
Bind visibility to checkable menu item shows error "Service provider is missing the INameResolver service" in WPF

关于WPF DataGrid - 使用复选框隐藏列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3208344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com