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

时间:2018-10-30 08:49:18

标签: c# wpf xaml

我有一些列的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。 但这必须是我的最后选择。

2 个答案:

答案 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。因此,我们可以利用它来进行使用。