我在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的间距是存在的 如何在“附加”绑定属性存在时添加文本块?
答案 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
。