如果textblock binded值为null,则删除行

时间:2016-09-03 14:10:08

标签: c# wpf xaml

我只是问一个类似的问题,但我注意到我的不好,我需要隐藏整行,而不仅仅是文本块。让我解释一下发生了什么。所以我有一个具有这种结构的ListBox:

<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 / s的所有行,其中包含null或空值,实际上我在纯xaml中管理它,如下所示:

<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>

但这不是一个好的解决方案。事实上,你如何看待按行和列组织的每个textblock,所以我需要隐藏包含空值的文本块的行。

使用我的解决方案,我只隐藏具有空值的文本块,这是无用的,因为该值已经为空或为空。

有机会通过xaml管理吗?我不知道怎样才能在xaml中执行此操作,&#39;因为如果我在中间隐藏一行,例如,我将获得一个空白区域,其中包含非空值的文本块的行。我不知道情况是否清楚。

如果有什么不清楚,请问,我会尝试更好地解释。感谢。

2 个答案:

答案 0 :(得分:2)

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

替换

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

<Grid.RowDefinitions>
    <RowDefinition>
        <RowDefinition.Style>
            <Style TargetType="RowDefinition">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Name}" Value="">
                        <Setter  Property="Height" Value="0" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Name}" Value="{x:Null}">
                        <Setter  Property="Height" Value="0" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </RowDefinition.Style>
    </RowDefinition>
    <RowDefinition>
        <RowDefinition.Style>
            <Style TargetType="RowDefinition">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Foo}" Value="">
                        <Setter  Property="Height" Value="0" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Foo}" Value="{x:Null}">
                        <Setter  Property="Height" Value="0" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </RowDefinition.Style>
    </RowDefinition>
</Grid.RowDefinitions>

答案 1 :(得分:0)

你试过转换器吗? 你可以为字符串编写一个转换器来实现可见性,如下所示:

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}}>