繁体   English   中英

DataTemplate中的XAML条件绑定

[英]XAML Conditional Binding in DataTemplate

我在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时,并不是每个列表项中都存在Additional TextBlock。

但是,无论DataBinding值是否为null,Additional TextBlock的间距都存在。
如何获得仅在“附加”绑定属性存在时添加的文本块?

这是您的转换器:

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>

若要在Additional属性不可用时折叠TextBlock ,请尝试将TargetNullValue设置为Collapsed绑定到TextBlockVisiblity属性。 我建议这样的事情:

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

但是事实证明,这对我不起作用,原因是我不知道。 但是用这种方法绑定就可以了:

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

相关问题:

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

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

当值为null时 ,Label隐藏。

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

如下:

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

将可见性设置为折叠时,整个元素(包括其边距)都将被折叠。

您可以尝试使用BindingBase.TargetNullValue为此:

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

预先创建属性MyMargin of Thickness? 输入一些默认值。 如果MyMargin的值将为空值,则取自TargetNullValue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM