Хобрук: Ваш путь к мастерству в программировании

Привязка к себе в стиле с помощью DataTrigger

У меня есть стиль для кнопки. В зависимости от того, включена кнопка или нет, я хочу изменить фон. Вот как это выглядит:

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=IsEnabled, PresentationTraceSources.TraceLevel=High}" Value="False">
            <Setter Property="Background" Value="Purple"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=IsEnabled, PresentationTraceSources.TraceLevel=High}" Value="True">
            <Setter Property="Background" Value="Yellow"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Это всего лишь базовый пример. На самом деле мне нужен MultiDataTrigger, но он даже не работает с обычным DataTrigger. Я вижу только серую кнопку.

Это след:

System.Windows.Data Предупреждение: 56: Создано BindingExpression (hash = 31767240) для Binding (hash = 6303779)
System.Windows.Data Предупреждение: 58: Путь: 'IsEnabled'
System.Windows.Data Предупреждение: 60: BindingExpression (hash = 31767240): режим по умолчанию разрешен для OneWay
System.Windows.Data Предупреждение: 61: BindingExpression (hash = 31767240): триггер обновления по умолчанию разрешен для PropertyChanged
System.Windows.Data Предупреждение: 62 : BindingExpression (hash = 31767240): Присоединиться к System.Windows.Controls.Button.NoTarget (hash = 24311680)
System.Windows.Data Предупреждение: 66: BindingExpression (hash = 31767240): RelativeSource (FindAncestor) требует контекста дерева
System.Windows.Data Предупреждение: 65: BindingExpression (hash = 31767240): разрешение отложенного источника
System.Windows.Data Предупреждение: 67: BindingExpression (hash = 31767240): разрешение источника
System.Windows. Предупреждение о данных: 70: BindingExpression (hash = 31767240): обнаружен элемент контекста данных: (OK)
System.Windows.Data Предупреждение: 7 3: предок поиска типа Button: запрошенная сетка (hash = 35377238)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошенный ContentPresenter (hash = 51189900)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен Border (hash = 48541090)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен StartStopControl (hash = 22721178)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошенная сетка (hash = 32321338)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошенный ContentPresenter (hash = 31184590)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен Border (hash = 37117888)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен MenuPanelControl (hash = 873549)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошенная сетка (hash = 29953511)
System.Windows.Data Warnin g: 73: предок поиска типа Button: запрошен ContentPresenter (hash = 42576376)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен AdornerDecorator (hash = 66649760)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен Border (hash = 23566381)
System.Windows.Data Предупреждение: 73: предок поиска типа Button: запрошен MainWindow (hash = 38392424)

Похоже, что он проходит через все визуальное дерево, начиная с сетки, в которой находится кнопка. Почему он не начинается с кнопки?


  • Если мой ответ вам помог, поставьте галочку в поле ответа, если не возражаете. 15.09.2016

Ответы:


1

Почему бы тебе не изменить его на Триггер?

  <Style x:Key="MyButtonStyle"
           TargetType="Button">
        <Style.Triggers>
            <Trigger Property="IsEnabled"
                     Value="False">
                <Setter Property="Background"
                        Value="Purple" />
            </Trigger>
            <Trigger Property="IsEnabled"
                     Value="True">
                <Setter Property="Background"
                        Value="Yellow" />
            </Trigger>
        </Style.Triggers>
    </Style>

Или, если вы все равно хотите его использовать, вам не нужно искать предка, потому что вы сейчас находитесь на кнопке:

  <Style x:Key="MyButtonStyle"
           TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, PresentationTraceSources.TraceLevel=High}"
                         Value="False">
                <Setter Property="Background"
                        Value="Purple" />
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, PresentationTraceSources.TraceLevel=High}"
                         Value="True">
                <Setter Property="Background"
                        Value="Yellow" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

Если это вам не поможет, вы должны предоставить более подробную информацию: исходный код XAML и, возможно, код вашей модели представления тоже.

15.09.2016
  • Мне нужно использовать DataTrigger, потому что я также хочу получить доступ к свойствам из моей ViewModel. Когда я пробую ваш второй пример, Intellisense выдает ошибку, но мне кажется, что я могу его скомпилировать и запустить нормально. Я посмотрю, смогу ли я восстановить ошибку. Пока спасибо. 15.09.2016
  • Это работает, но почему-то Intellisense показывает это как ошибку. Думаю, я смогу с этим жить. 15.09.2016
  • @ Mr.B ваше предложение использовать Trigger вместо DataTrigger сработало для меня. Но есть идеи, почему? Спасибо 10.11.2017
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..