当所有值都为空时,WPF隐藏DataGridTemplateColumn



我有一个带有一些列的WPF数据网格。我有一个专栏大部分时间都是空的。该列中填充了一个小按钮。该按钮有一个可见性转换器,取决于要显示/不显示的属性。因此,如果按钮没有显示,我希望能够不显示此列。有可能在xaml中做Is吗?

下面是我的代码。

<DataGrid name="..." ItemsSource="...">
<DataGrid.Columns>
<DataGridTextColumn ...
<DataGridTextColumn ...
<DataGridTextColumn ...
<DataGridTextColumn ...
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Visibility="{Binding IsShown Converter={StaticResource BooleanToCollapseConverter}}" Command="...">
<Image Source="...">
</Image>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

我尝试将datagridtemplatecolumn的宽度设置为auto,但没有成功。如果我的列需要为空,可以在后面签入代码,并将其存储为布尔值,将其转换为visibility.collapse。但这是我最后的选择。

查看隐藏数据网格模板列时其为空

也许这就是你想要的

您可以在datagridtextcolumn或模板上设置可见性直接性。问题是这些列不在数据网格的可视化树中,这意味着它不会继承其父级的数据上下文。如果你想确保绑定工作,你应该创建某种代理,从父控件继承数据上下文,例如:

<FrameworkElement x:Name="Proxy" Visibility="Collapsed" />

控件中您确信具有正确数据上下文的任何位置。这个元素肯定会继承它。所以开门见山。我为您举了一个小例子来更改列绑定中的可见性:

<Grid>
<FrameworkElement x:Name="Proxy" Visibility="Collapsed" />
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Customers}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Name" Binding="{Binding Surname}" />
<DataGridTextColumn Header="Name" Binding="{Binding Age}" />
<DataGridTemplateColumn Visibility="{Binding DataContext.IsShown, Converter={StaticResource BoolToVisibilityConverter}, Source={x:Reference Proxy}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Test" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
</Style>
</DataGrid.ItemContainerStyle>
</DataGrid>
</Grid>

IsShown属性显然在视图模型方面。如果你对这种解决方案不满意,你可以尝试添加不同的代理客户端,如下所示:

public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object),
typeof(BindingProxy));
}

...
<DataGrid.Resources>
<utils:BindingProxy x:Key="BindingProxy" Data="{Binding}" />
</DataGrid.Resources>
...

使用Freezable类-即使不在可视化或逻辑树中,Freezable对象也可以继承DataContext。因此,我们可以利用这一点。

最新更新