将Boder.Background绑定到Resource Dictionary的LinearGradientBrush

时间:2011-10-24 22:03:06

标签: c# wpf xaml data-binding

我想将Border Property的背景绑定到列表中的元素。

我有一个字典,其中包含以下内容:

<LinearGradientBrush x:Key="ConfigurationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FFAABBCC" Offset="1"/>
    <GradientStop Color="#FFCCDDEE" Offset="0.7"/>
</LinearGradientBrush>    

<LinearGradientBrush x:Key="NavigationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FFD97825" Offset="1"/>
    <GradientStop Color="#FFFF9A2E" Offset="0.7"/>
</LinearGradientBrush>

现在我填充一个ObservableCollection,其中包含一个包含名为“BackgroundStyle”的属性的对象。当我填充带有样式背景的列表框时,我想将背景绑定到“BackgroundStyle”

<Border x:Name="Border" BorderThickness="1" CornerRadius="4" Width="120" Height="80"
        VerticalAlignment="Center" HorizontalAlignment="Center" Padding="4"
        BorderBrush="Black" Background="{Binding Path=BackgroundStyle}">

这很好用,如果BackgroundStyle =“Red”或“Green”但如果我使用“ConfigurationItemBackground”它将不起作用。

有什么建议吗? 谢谢你的帮助;)

-Tim -

1 个答案:

答案 0 :(得分:0)

您不能完全按照自己的意图去做,这主要是使用数据绑定来存储绑定对象中资源的。最接近的是this question的答案,它基本上使用ValueConverter从应用程序的资源中获取资源。

不幸的是,这不适用于你想要做的事情,即使用本地资源。为此,您最好编写自己的自定义ValueConverter,将string值转换为画笔。

可以做一些像这样的通用:

[ValueConversion(typeof(string), typeof(object))]
public class ResourceKeyConverter : IValueConverter
{
    public ResourceKeyConverter()
    {
        Resources = new ResourceDictionary();
    }

    public ResourceDictionary Resources { get; private set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    { 
        return Resources[(string)value];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException();
    }
}

然后像这样使用它:

<Window.Resources>
    <my:ResourceKeyConverter x:Key="keyConverter">
        <ResourceKeyConverter.Resources>
            <LinearGradientBrush x:Key="ConfigurationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFAABBCC" Offset="1"/>
                <GradientStop Color="#FFCCDDEE" Offset="0.7"/>
            </LinearGradientBrush>    

            <LinearGradientBrush x:Key="NavigationItemBackground" EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFD97825" Offset="1"/>
                <GradientStop Color="#FFFF9A2E" Offset="0.7"/>
            </LinearGradientBrush>
        </ResourceKeyConverter.Resources>
    </my:ResourceKeyConverter>
</Window.Resources>

...

<Border Background="{Binding BackgroundStyle, Converter={StaticResource keyConverter}}">
</Border>

(我在家,在我面前没有Visual Studio,所以这可能需要一些调整,但它应该在很大程度上是正确的。)