Binding in triggers

179
24 октября 2018, 21:50

Я описую шаблон для кнопки, хочу чтобы цвет кнопки при наведении и в нормальном состоянии задавался пользователем. Но при установке тригерров мне выдает ошибку "The member "RelativeSource" is not recognized or is not accessible". Как исправить?

<Window x:Class="ExpenseTracker.Views.MainWindowView"
        x:ClassModifier="internal"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:controls="clr-namespace:ExpenseTracker.Controls"
        WindowStartupLocation="CenterScreen"
        Title="Expense Traker"
        Height="500"
        Width="500">
    <Window.Resources>
        <SolidColorBrush x:Key="NormalBackground" Color="#FF5FB860"/>
        <SolidColorBrush x:Key="MouseOverBackground" Color="#FF509A50"/>
        <ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type controls:RoundButton}">
            <Border Background="{TemplateBinding Background}"
                    Height="30"
                    x:Name="border"
                    BorderThickness="2">
                <ContentPresenter Content="{TemplateBinding Content}" 
                                  HorizontalAlignment="Center" 
                                  VerticalAlignment="Center"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="{TemplateBinding MouseOverBackground, RelativeSource={RelativeSource TemplatedParent}}" TargetName="border"></Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Window.Resources>
    <controls:RoundButton Template="{StaticResource buttonTemplate}"
                          Background="{StaticResource NormalBackground}"
                          MouseOverBackground="{StaticResource MouseOverBackground}">
    </controls:RoundButton>
</Window>

И сам класс:

internal sealed class RoundButton :Button
{
    public static readonly DependencyProperty MouseOverBackgroundProperty = DependencyProperty.Register(
        "MouseOverBackground", 
        typeof(SolidColorBrush), 
        typeof(RoundButton), 
        new PropertyMetadata(null));
    public SolidColorBrush MouseOverBackground
    {
        get { return (SolidColorBrush)GetValue(MouseOverBackgroundProperty); }
        set { SetValue(MouseOverBackgroundProperty, value); }
    }
}
Answer 1

В классе TemplateBindingExtension отсутствует свойство RelativeSource. Используйте обычный Binding (TemplateBinding нельзя использовать в триггере):

<Setter Property="Background"
        Value="{Binding MouseOverBackground,
            RelativeSource={RelativeSource TemplatedParent}}"
        TargetName="border"/>
READ ALSO
Пагинация на сайте

Пагинация на сайте

задание сделать библиотеку(реальная с книгами и газетами) с использованием трехслойной архитектурой, где UI - asp net mvcПервым заданием делал...

173
MySQL SELECT JOIN 3 таблицы, LIMIT 1

MySQL SELECT JOIN 3 таблицы, LIMIT 1

Всем добраВозникли трудности, работая с 3-мя таблицами

148
Маска ввода textbox для телефона WPF

Маска ввода textbox для телефона WPF

У меня есть textbox в который из бд выводится номер телефона:

319
Поменять цвет кнопки для Html хелпера

Поменять цвет кнопки для Html хелпера

На вьюхе есть Html хелпер который генерирует следующую разметку:

164