如何在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;
        }
    }
}

如何在WPF中正确使用转换器

您需要返回画笔而不是字符串:

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