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

时间:2014-08-21 16:12:47

标签: c# wpf xaml

我有一个按钮列表的设置,这些按钮在应用程序启动时显示最近的项目文件路径。此时,仍然存在的文件路径仍然可以点击,并且找不到的文件路径不可点击。但是,我想修改现有代码,使不存在的文件路径不可分割并具有不同的背景颜色。我怎么会优雅地做到这一点?

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

2 个答案:

答案 0 :(得分:2)

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

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中使用的字符串会隐式转换为画笔,但对于转换器,这不会发生

答案 1 :(得分:0)

我只会使用一个触发器,你的转换器是正确的,但在这种情况下不需要使用它。

<Trigger Property=Enabled Value=True>
  <Trigger.Setters>
    <Setter Property=Background Value=Gray />
  </Trigger.Setters>
</Trigger>

然后只需将默认背景颜色设置为LightGray。