C# 如果textblock绑定值为空,则删除行

C# 如果textblock绑定值为空,则删除行,c#,wpf,xaml,C#,Wpf,Xaml,我只是问了一个类似的问题,但我注意到,对于我的错误,我需要隐藏整行,而不仅仅是文本块。让我解释一下发生了什么。因此,我有一个具有以下结构的列表框: <ListBox VerticalAlignment="Stretch" ItemsSource="{Binding EventInfo}"> <ListBox.ItemTemplate> <DataTemplate> <Grid> <Gri

我只是问了一个类似的问题,但我注意到,对于我的错误,我需要隐藏整行,而不仅仅是文本块。让我解释一下发生了什么。因此,我有一个具有以下结构的列表框:

<ListBox VerticalAlignment="Stretch"
     ItemsSource="{Binding EventInfo}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
           <Grid.ColumnDefinitions>
               <ColumnDefinition Width="100"/>
               <ColumnDefinition Width="20"/>
           </Grid.ColumnDefinitions>
           <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
           </Grid.RowDefinitions>
          <TextBlock Text="Event:" FontWeight="Bold" Grid.Column="0" Grid.Row="0"/>
          <TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="1" Grid.Row="0"/>
          <TextBlock Text="Foo:" FontWeight="Bold" Grid.Column="0" Grid.Row="1"/>
          <TextBlock Text="{Binding Foo}" FontWeight="Bold" Grid.Column="1" Grid.Row="1"/>
         </Grid>
    </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>
但这不是一个好的解决方案。事实上,您如何看到我已按行和列组织了每个
textblock
,因此我需要隐藏包含具有null值的textblock的行

在我的解决方案中,我只隐藏具有null值的textblock,这是无用的,因为该值已经为空或null

有机会通过xaml管理它吗?我不知道如何在XAML中做到这一点,因为如果我在中间隐藏一行,那么我将得到一个空格,该行包含不带NULL值的文本块。我不知道情况是否清楚

如果有什么不清楚的地方,问问我,我会尽量解释得更好。谢谢。

你试过转换器吗? 您可以编写字符串到可见性的转换器,如下所示:

<ListBox.Resources>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <Trigger Property="Text" Value="">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
      <Trigger Property="Text" Value="{x:Null}">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListBox.Resources>
public class EmptyNotVisibleConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.IsNullOrEmpty(value as string) ? 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 EmptyNotVisibleConverter();
        return _converter;
    }

    private static EmptyNotVisibleConverter _converter = null;
}
<Grid Visibility={Binding Name, Converter={local:EmptyNotVisibleConverter}}>
并在网格上使用它,如下所示:

<ListBox.Resources>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <Trigger Property="Text" Value="">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
      <Trigger Property="Text" Value="{x:Null}">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListBox.Resources>
public class EmptyNotVisibleConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.IsNullOrEmpty(value as string) ? 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 EmptyNotVisibleConverter();
        return _converter;
    }

    private static EmptyNotVisibleConverter _converter = null;
}
<Grid Visibility={Binding Name, Converter={local:EmptyNotVisibleConverter}}>

您尝试过转换器吗? 您可以编写字符串到可见性的转换器,如下所示:

<ListBox.Resources>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <Trigger Property="Text" Value="">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
      <Trigger Property="Text" Value="{x:Null}">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListBox.Resources>
public class EmptyNotVisibleConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.IsNullOrEmpty(value as string) ? 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 EmptyNotVisibleConverter();
        return _converter;
    }

    private static EmptyNotVisibleConverter _converter = null;
}
<Grid Visibility={Binding Name, Converter={local:EmptyNotVisibleConverter}}>
并在网格上使用它,如下所示:

<ListBox.Resources>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <Trigger Property="Text" Value="">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
      <Trigger Property="Text" Value="{x:Null}">
          <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListBox.Resources>
public class EmptyNotVisibleConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.IsNullOrEmpty(value as string) ? 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 EmptyNotVisibleConverter();
        return _converter;
    }

    private static EmptyNotVisibleConverter _converter = null;
}
<Grid Visibility={Binding Name, Converter={local:EmptyNotVisibleConverter}}>

您可以相应地设置网格行高度

替换

<Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
</Grid.RowDefinitions>


您可以相应地设置网格行高度

替换

<Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
</Grid.RowDefinitions>



Funk我正在尝试实现您的代码,但我不明白一件事:
应该放在
行定义之后
?好的,我现在理解了逻辑,非常有趣,我不知道这种做法。非常感谢这个解决方案:)祝您愉快。Funk我正在尝试实现您的代码,但我不明白一件事:
应该放在
行定义之后
?好的,我现在理解了逻辑,非常有趣,我不知道这种做法。真的非常感谢这个解决方案:)祝你有一个愉快的一天。