如何在WPF中正确使用转换器
本文关键字:转换器 WPF | 更新日期: 2023-09-27 18:19:03
我设置了一个按钮列表,在应用程序启动时显示最近的项目文件路径。此时,仍然存在的文件路径仍可点击,未找到的文件路径不可点击。但是,我想修改现有的代码,使不存在的文件路径可以伪装,并具有不同的背景颜色。我怎样才能优雅地做到这一点?
<Grid.Resources>
<Style TargetType="Button" x:Key="OpenProjectButtonStyle">
<Setter Property="Command" Value="{Binding Command, Converter={StaticResource ObjectToCommandConverter}}" />
<Setter Property="ToolTip" Value="{Binding ToolTipDescription}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="ButtonWrapper" Background="Transparent" Cursor="Hand">
<StackPanel Orientation="Horizontal" Margin="5">
<Image Source="{Binding LargeImageUrl}" Stretch="None" Margin="0,0,5,0" />
<StackPanel>
<TextBlock Name="LabelText" Text="{Binding Label}"
Foreground="{StaticResource SelectedForeground}"
FontSize="13" />
<TextBlock Text="{Binding ToolTipDescription}"
Foreground="#616161"
FontSize="11" />
</StackPanel>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="ButtonWrapper" Property="Background" Value="{StaticResource Background}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
我假设我想做一个绑定/转换,就像前几个setter之一,但我仍然不确定如何。这是目前为止我在转换类中写的:
class CommandEnabledToBackgroundConverter : IValueConverter
{
public String Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool) value) //if command.Enabled is true
{
return "Gray";
}
else
{
return "LightGray";
}
}
public bool ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.Equals("Gray")) //if command.Enabled is true
{
return true;
}
else
{
return false;
}
}
}
您需要返回画笔而不是字符串:
class CommandEnabledToBackgroundConverter : IValueConverter
{
public String Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool) value) //if command.Enabled is true
{
return new SolidColorBrush(Colors.Gray);
}
else
{
return new SolidColorBrush(Colors.LightGray);
}
}
public bool ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
通常在XAML中使用的字符串隐式地转换为笔刷,但对于转换器,这不会发生
我只会使用触发器,您的转换器是正确的,但在这种情况下不需要使用一个。
<Trigger Property=Enabled Value=True>
<Trigger.Setters>
<Setter Property=Background Value=Gray />
</Trigger.Setters>
</Trigger>
然后将默认背景色设置为LightGray