嵌套的datagrid列可见性基于其内部数据网格

时间:2016-06-15 09:55:55

标签: c# wpf xaml mvvm datagrid

我有一个嵌套的数据网格,我希望在内部数据网格没有任何数据时隐藏外部数据网格列。我正在使用MVVM模式。模型填充绑定到视图的集合中的数据。

Filled Datagrid

Component1,2和3的列表通过外部数据网格内的数据网格显示。每个标签系列都有左右两个集合。

当模型没有任何用于左标签收集的组件时,我希望完全隐藏左列。如下图所示。同样适用于右栏。

Left Column Hidden

请帮助我实现这一目标。

我在这个网站和谷歌上搜索过类似的情况,但是找不到类似的东西。

以下是XAML代码:

    <DataGrid ItemsSource="{Binding Labels}"                          
          CanUserAddRows="False" 
          CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="10*" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding LabelFamily}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Right" Width="25*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DataGrid ItemsSource="{Binding LeftLabel.Components}"                                              
                              CanUserAddRows="False" 
                              CanUserDeleteRows="False">                                        
                    </DataGrid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Left" Width="25*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DataGrid ItemsSource="{Binding RightLabel.Components}"                           
                              CanUserAddRows="False" 
                              CanUserDeleteRows="False">                        
                    </DataGrid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

我不会发布模型代码以尽可能缩短帖子。

1 个答案:

答案 0 :(得分:0)

你可以像这样创建转换器(我使用ObservableCollection进行测试,你应该使用你的容器):

public class NoElementVisibilityConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Visibility.Collapsed;
        ObservableCollection<int> ienum = value as ObservableCollection<int>;
        return ienum == null || ienum.Count() == 0 ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (_converter == null)
            _converter = new NoElementVisibilityConverter();
        return _converter;
    }

    private static NoElementVisibilityConverter _converter = null;
}

并在你的专栏上使用它:

<DataGridTemplateColumn Header="Left" Width="25*"
                        Visibility={Binding RightLabel.Components, Converter={local:NoElementVisibilityConverter}>

不要忘记在Window中包含Converter名称空间。