我有一个 DataGrid 的可见性转换器,当网格的项目源为空时,它应该隐藏网格。项目源是窗口类的属性。
这是窗口的部分 XAML - 窗口和可见性转换器定义以及数据网格:
窗口:
<Window x:Name="DiagramWindow"
x:Class="FabricAnalyzer.FabricDiagram"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FabricAnalyzer"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
mc:Ignorable="d"
Title="FabricDiagram"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<ResourceDictionary>
<local:SwitchThumbColorConverter x:Key="SwitchThumbColor"/>
<local:PortThumbColorConverter x:Key="PortThumbColor"/>
<local:StringLengthVisiblityConverter x:Key="VisConverter"/>
<local:PortListVisiblityConverter x:Key="PortVisConverter"/>
数据网格:
<Grid Name="FabricGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<DataGrid Name="SVCPortDataGrid" Grid.Column="0" Width="Auto"
Visibility="{Binding Path=PortList, Converter=
{StaticResource PortVisConverter}}"
AutoGenerateColumns="False">
下面是它应该绑定(bind)到的属性和 VisibilityConverter 的代码。这个想法是,如果 PortList 为空(默认情况下为空),则 DataGrid 应保持折叠状态。我已验证 PortList 在我想要的情况下为空。
public partial class FabricDiagram : Window
{
public List<PortResult> PortList = null;
最后是可见性转换器。我已经在调试器中验证它没有被调用。
public class PortListVisiblityConverter : IValueConverter
{
public Object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null )
{
return Visibility.Collapsed;
}
else
{
return Visibility.Visible;
}
}
public Object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我尝试将 XAML 更改为此绑定(bind)
Visibility="{Binding PortList, Converter={StaticResource PortVisConverter}}"
最佳答案
您的绑定(bind)失败,因此转换器永远不会运行。
public List<PortResult> PortList = null;
声明一个字段,并且您只能绑定(bind)到属性。更改为:
public List<PortResult> PortList { get; set; } = null;
将解决您的第一个问题;那么如果您希望将该属性的更改传播到 UI,则需要使用 INotifyPropertyChanged
。
顺便说一句,如果您在运行时查看输出窗口并看到 System.Data
异常,您可能已经弄清楚了这一点。调试绑定(bind)问题的最简单方法:)
关于c# - 可见性转换器绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418999/