我有一些列的WPF数据网格。我有一栏在大多数情况下将是空的。该列中有一个小按钮。 该按钮具有可见性转换器,具体取决于要显示/不显示的属性。因此,如果按钮未显示,我希望不显示此列。 可以用xaml做吗?
下面是我的代码。
<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,但是没有用。 起作用的一件事是在后面的代码中签入我的列是否需要为空,并将其存储为布尔值以将其转换为visible.collapse。 但这必须是我的最后选择。
答案 0 :(得分:2)
看看hide data grid template column when its empty
也许这就是您要寻找的
答案 1 :(得分:0)
您可以在datagridtext列或模板上直接设置可见性。问题是这些列不位于数据网格的可视树中,这意味着它不继承其父级的数据上下文。如果要确保绑定正常工作,则应创建某种代理,该代理将从父控件继承数据上下文,例如:
<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。因此,我们可以利用它来进行使用。