DataTemplate中的XAML条件绑定

时间:2014-04-22 11:06:41

标签: c# wpf xaml

我在XAML中有一个ListView的DataTemplate:

    <DataTemplate x:Key="ResultItemTemplate">
        <Grid Grid.Column="2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="auto" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="auto" />
                    </Grid.RowDefinitions>
                    <TextBlock Text="{Binding Name}" 
                               Margin="0,10,20,0" 
                               Grid.Column="0"
                               Grid.Row="0"/>

                    <TextBlock Text="{Binding TimeStamp}" 
                               Margin="0,10,10,0" 
                               Grid.Column="1"
                               Grid.Row="0"/>

                    <TextBlock Text="{Binding Text}" 
                               Grid.Column="0"
                               Grid.ColumnSpan="2"
                               Grid.Row="1"
                               TextWrapping="Wrap" 
                               Height="auto"
                               Margin="0,0,10,10"/>

                    <TextBlock Text="{Binding Additional}" 
                               Grid.Column="0"
                               Grid.ColumnSpan="2"
                               Grid.Row="2"
                               TextWrapping="Wrap" 
                               Height="auto"
                               Margin="0,0,10,20" />
                </Grid>
        </DataTemplate>

因此将此DataTemplate应用于我的ListView,每个列表项中都不存在附加TextBlock。

但是,如果DataBinding值为null,则Additional TextBlock的间距是存在的 如何在“附加”绑定属性存在时添加文本块?

5 个答案:

答案 0 :(得分:4)

这是你的转换器:

namespace ValueConveters
{
    public class NullToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value == null ? Visibility.Collapsed : Visibility.Visible;
        }

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

这是你的XAML: 把它放在你的根元素中:

xmlns:conveters="clr-namespace:ValueConveters"

然后在您的资源中:

<conveters:NullToVisibilityConverter x:Key="NullToVisibilityConverter"/>
<DataTemplate x:Key="ResultItemTemplate">
    <Grid Grid.Column="2">
       <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="auto" />
       </Grid.ColumnDefinitions>
       <Grid.RowDefinitions>
          <RowDefinition Height="auto" />
          <RowDefinition Height="*" />
          <RowDefinition Height="auto" />
       </Grid.RowDefinitions>
       <TextBlock Text="{Binding Name}" 
           Margin="0,10,20,0" 
           Grid.Column="0"
           Grid.Row="0"/>
       <TextBlock Text="{Binding TimeStamp}" 
           Margin="0,10,10,0" 
           Grid.Column="1"
           Grid.Row="0"/>
       <TextBlock Text="{Binding Text}" 
           Grid.Column="0"
           Grid.ColumnSpan="2"
           Grid.Row="1"
           TextWrapping="Wrap" 
           Height="auto"
           Margin="0,0,10,10"/>
       <TextBlock Text="{Binding Additional}" 
           Visibility="{Binding Additional,Converter={StaticResource NullToVisibilityConverter}}"
           Grid.Column="0"
           Grid.ColumnSpan="2"
           Grid.Row="2"
           TextWrapping="Wrap" 
           Height="auto"
           Margin="0,0,10,20" />
    </Grid>
</DataTemplate>

答案 1 :(得分:3)

要在TextBlock属性不可用时折叠Additional,请尝试绑定TextBlock的{​​{1}}属性,并将Visiblity设置为TargetNullValue }。我会建议这样的事情:

Collapsed

但事实证明这对我不起作用,原因我不知道。但以这种方式绑定可以解决问题:

<TextBlock Text="{Binding Additional}" 
           Grid.Column="0"
           Grid.ColumnSpan="2"
           Grid.Row="2"
           TextWrapping="Wrap" 
           Height="auto"
           Margin="0,0,10,20"
           Visibility="{Binding Additional, TargetNullValue=Collapsed}"
           />

相关问题:

答案 2 :(得分:1)

基于Flat Eric的建议 - 字段可以绑定到IsVisible属性:

<Label IsVisible="{Binding Foo}" Text="{Binding Foo}"/>

当值为 null 时,标签将被隐藏。

答案 3 :(得分:0)

您可以编辑文本块的样式,并根据绑定的值将可见性设置为折叠或可见。后者可以使用数据触发器完成。 如果您根据绑定的值创建一个返回true或false的属性ShowAdditional将更容易。这样您就可以轻松自定义何时显示。

如下:

<TextBlock Text="{Binding Additional}" Grid.Column="0" Grid.ColumnSpan="2"  Grid.Row="2" TextWrapping="Wrap" Height="auto" Margin="0,0,10,20">
   <TextBlock.Style>
      <Style TargetType="TextBlock">
         <Style.Triggers>
           <DataTrigger Binding="{Binding ShowAddition}" Value="True">
             <Setter Property="Visibility" Value="Visible" />
           </DataTrigger>
           <DataTrigger Binding="{Binding CameraState}" Value="False">
             <Setter Property="Visibility" Value="Collapsed" />
           </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBlock.Style>
</TextBlock>

当visiblity设置为折叠时,整个元素将折叠,包括其边距。

答案 4 :(得分:0)

您可以尝试使用BindingBase.TargetNullValue

<TextBlock Margin="{Binding Path=MyMargin, TargetNullValue=0}" />

预先创建具有默认值的MyMargin类型的属性Thickness?。如果MyMargin的值为null值,则值取自TargetNullValue