Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 不存在记录时隐藏数据网格_Wpf_Xaml - Fatal编程技术网

Wpf 不存在记录时隐藏数据网格

Wpf 不存在记录时隐藏数据网格,wpf,xaml,Wpf,Xaml,目前,当数据网格控件中没有填充记录时,我需要隐藏数据网格控件 我试着像下面那样设置它,但没有效果 <DataGrid ItemsSource="{Binding Employees}" AutoGenerateColumns="True" IsReadOnly="True" Visibility="{Binding Employees.Count>0, Converter={StaticResource BooleanToVisibilityConverter}}"></

目前,当数据网格控件中没有填充记录时,我需要隐藏数据网格控件

我试着像下面那样设置它,但没有效果

<DataGrid ItemsSource="{Binding Employees}" AutoGenerateColumns="True" IsReadOnly="True" Visibility="{Binding Employees.Count>0, Converter={StaticResource BooleanToVisibilityConverter}}"></DataGrid>


请为我推荐一个解决方案,您必须使用一个将整数转换为可见性的转换器。在您的情况下,0表示隐藏/折叠,0以上的所有内容表示可见

在绑定路径中使用表达式是不可能的,因为WPF在内部使用反射来查找属性的值

在您的情况下,转换器如下所示:

public class CountToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
    {
        int count = value as int;
        if(count != null && count > 0) return Visibility.Visible;
        else return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
您必须实现
IValueConverter
<代码>转换用于将绑定转换为实际值
ConvertBack
将用于反向转换


要使用它,您必须引用程序集并将其添加为静态资源,就像您使用BooleantVisibilityConverter所做的那样。

您可以创建自定义转换器,但在我看来,在这种情况下,简单地使用
Style.Trigger
更容易,当
Employees.Count
为0时,它将
可视性
设置为折叠,如下所示:

<DataGrid ItemsSource="{Binding Employees}" AutoGenerateColumns="True" IsReadOnly="True">
    <DataGrid.Style>
        <Style TargetType="{x:Type DataGrid}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Employees.Count}" Value="0">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Style>
</DataGrid>

我修改了@dkozl-answer以删除对
ItemSource
名称的依赖关系。现在我们可以添加到所有
DataGrid
,而不考虑
ItemSource
定义

<DataGrid>
    <DataGrid.Style>
        <Style TargetType="{x:Type DataGrid}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Style>
</DataGrid>


如果您对此解决方案有问题,请从
DataGrid
本身删除
Visibility
属性。允许触发器确定可见性。

您是说BooleantVisibilityConverter吗?如果是,我已经这样做了,你可以创建自己的转换器。我将发布一个示例