Привязка Boder.Background к LinearGradientBrush из словаря ресурсов - PullRequest
0 голосов
/ 25 октября 2011

Я бы хотел привязать фон свойства границы к элементам в списке.

У меня есть словарь, содержащий следующий текст:

<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 голосов
/ 25 октября 2011

Вы не можете делать в точности то, что пытаетесь сделать, а именно использовать привязку данных для хранения ключа ресурса в вашем связанном объекте. Ближайшим ответом будет на этот вопрос , который в основном использует 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 передо мной, так что это может потребовать некоторой настройки, но это должно быть в значительной степени правильно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...