2016-09-15 2 views
1

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

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

Это след:

System.Windows.Data Внимание: 56: Созданный BindingExpression (хэш = 31767240) для связывания (хэш = 6303779)
System.Windows.Data Внимание: 58: Путь : 'IsEnabled'
System.Windows.Data Предупреждение: 60: BindingExpression (hash = 31767240): Режим по умолчанию разрешен для OneWay
System.Windows.Data Warning: 61: BindingExpression (hash = 31767240): триггер обновления по умолчанию, разрешенный для PropertyChanged
System.Windows.Data Предупреждение: 62: BindingExpression (hash = 31 767240): Присоединить к System.Windows.Controls.Button.NoTarget (hash = 24311680)
System.Windows.Data Предупреждение: 66: BindingExpression (hash = 31767240): RelativeSource (FindAncestor) требует контекста дерева
System.Windows. Предупреждение данных: 65: BindingExpression (hash = 31767240): Разрешить отложенный источник
System.Windows.Data Предупреждение: 67: BindingExpression (hash = 31767240): Разрешение источника
System.Windows.Data Предупреждение: 70: BindingExpression (hash = 31767240): Найденный элемент контекста данных: (OK)
System.Windows.Data Предупреждение: 73: Поиск предка типа Кнопка: запрошенная сетка (hash = 35377238)
System.Windows.Data Предупреждение: 73: Поиск предка типа Bu tton: quedied ContentPresenter (hash = 51189900)
System.Windows.Data Предупреждение: 73: Поиск предка типа Button: queried Border (hash = 48541090)
System.Windows.Data Warning: 73: Поиск предка типа Button: quedied StartStopControl (hash = 22721178)
System.Windows.Data Предупреждение: 73: Поиск предка типа Кнопка: запрошенная Сетка (hash = 32321338)
System.Windows.Data Предупреждение: 73: Поиск предка типа Button: quedied ContentPresenter (hash = 31184590)
System.Windows.Data Warning: 73: Поиск предка типа Button: queried Border (hash = 37117888)
System.Windows.Data Предупреждение: 73: Поиск предка типа Button: queried Menu PanelControl (hash = 873549)
System.Windows.Data Предупреждение: 73: Поиск предка типа Button: queried Grid (hash = 29953511)
10 System.Windows.Data Предупреждение: 73: Поиск предка типа Button: quedied ContentPresenter (hash = 42576376)
System.Windows.Data Warning: 73: Поиск предка типа Button: queried AdornerDecorator (hash = 66649760)
System.Windows.Data Предупреждение: 73: Поиск предка типа Button: queried Border (hash = 23566381)
System.Windows.Data Внимание: 73: Поиск предок кнопки типа: опрошена MainWindow (хэш = 38392424)

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

+0

Если мой ответ помог вам, отметьте этот флажок как «ответ», если вы не возражаете. –

ответ

6

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

<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 и, возможно, код View Model.

+0

Мне нужно использовать DataTrigger, потому что я также хочу получить доступ к свойствам из моего ViewModel. Когда я попробую ваш второй пример, Intellisense дает мне ошибку, однако кажется, что я могу скомпилировать и запустить ее просто отлично. Я посмотрю, смогу ли я восстановить ошибку. Спасибо, пока. – gartenriese

+0

Это работает, но как-то Intellisense показывает это как ошибку. Думаю, я смогу жить с этим. – gartenriese

+0

@ Mr.B Ваше предложение использовать Trigger вместо DataTrigger сработало для меня. Но любая идея почему? благодаря –