Edw*_*uay 15 wpf xaml triggers
我想告诉WPF:" 如果TextBlock不包含任何数据,那么就不要显示它. "
带有简单触发器的TRY#1会产生错误" 'Text'成员无效,因为它没有合格的类型名称. ":
<StackPanel Margin="10">
<TextBlock Padding="10" Background="Yellow" Text="{Binding MainMessage}">
<TextBlock.Triggers>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</TextBlock.Triggers>
</TextBlock>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
带样式触发器的TRY#2产生错误类型'style'不包含公共类型转换器类:
<UserControl x:Class="TestItemsSource234.Views.SmartForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<Style x:Key="MainMessageStyle" TargetType="TextBlock">
<Style.Triggers>
<Trigger>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<StackPanel Margin="10">
<TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/>
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
使用样式DataTrigger的TRY#3产生相同的错误类型'style'不包含公共类型转换器类:
<UserControl x:Class="TestItemsSource234.Views.SmartForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<Style x:Key="MainMessageStyle" TargetType="TextBlock">
<Style.Triggers>
<Trigger>
<DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<StackPanel Margin="10">
<TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/>
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
尝试#4:好吧,这是我的一个愚蠢的监督,忘记了StaticResource,但即使这样,尝试#2和尝试#3都会出现新的错误Style中的System.Windows.Trigger类型未知:
<UserControl x:Class="TestItemsSource234.Views.SmartForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<Style x:Key="MainMessageStyle" TargetType="TextBlock">
<Style.Triggers>
<Trigger>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<StackPanel Margin="10">
<TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/>
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
那我该怎么做?
好吧,这是一个令人抓狂的语法,有一个快乐的结局,这是有效的版本,希望它有助于某人,经验教训:
有效的代码:
<UserControl x:Class="TestItemsSource234.Views.SmartForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<Style x:Key="MainMessageStyle" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<StackPanel Margin="10">
<ItemsControl
ItemsSource="{Binding DataTypeViews}"/>
<TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/>
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
最简单,最简单,最快捷的方式是转换器.所以,为什么不KISS?(保持简单,愚蠢)?
要实现转换器类,只需要几行代码.
转换器:
public class StringToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return string.IsNullOrWhiteSpace((string)value) ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var visiblity = (Visibility)value;
return visiblity == Visibility.Visible;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
包含命名空间:
xmlns:c="clr-namespace:Hfr.Windows.Controls"
定义资源:
<c:StringToVisibilityConverter x:Key="StringToVisiblity"/>
用它:
<TextBlock
Text="{Binding SomeStringPropertyValue}"
TextWrapping="Wrap"
Visibility="{Binding SomeStringPropertyValue, Converter={StaticResource StringToVisiblity}}" />
Run Code Online (Sandbox Code Playgroud)
由于您将在多个项目中使用转换器,因此请在"公共库"中实现转换器类.
Try #2 或 Try #3 应该没问题 - 问题出在您引用样式的行 - 您需要使用 'Style="{StaticResource [KeyName]}"' 或 'Style="{DynamicResource [键名]}"'.
试试这个(在尝试 #2 中):
<StackPanel Margin="10">
<TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
在尝试 1 中,您揭示了当前 WPF 版本的限制:元素上不直接支持触发器。