Почему этот простой стиль не применяется?

#c# #.net #wpf #xaml #styles

#c# #.net #wpf #xaml #стили

Вопрос:

Почему текстовый блок остается черным?

 <Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="TextBlock" x:Key="style">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" Value="True">
                    <Setter Property="Foreground" Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="Test" Tag="True" Style="{StaticResource style}" />
    </StackPanel>
</Window>
  

Обновление: Хорошо, теперь у меня другая проблема. Стиль не реагирует на изменение свойства:

 <Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="TextBlock" x:Key="style">
            <Style.Triggers>
                <Trigger Property="Tag" Value="True">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{Binding Prop}" Tag="{Binding Prop}" Style="{StaticResource style}" x:Name="text" />
        <Button Content="Test" Click="Button_Click" />
    </StackPanel>
</Window>
  

Резервный код:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.ComponentModel;

namespace WpfApplication4
{
    public partial class MainWindow : Window
    {
        private MyClass a = new MyClass();

        public MainWindow()
        {
            InitializeComponent();
            DataContext = a;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            a.Prop = true;
            a.OnPropertyChanged("Prop");
        }
    }

    public class MyClass : INotifyPropertyChanged
    {
        public bool Prop { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
  

Текст TextBlock изменяется, а цвет — нет

Комментарии:

1. Пожалуйста, не принимайте ответ, а затем обновите вопрос другой проблемой . Вместо этого задайте новый вопрос.

Ответ №1:

Измените его на триггер свойства

     <Style TargetType="TextBlock" x:Key="style">
        <Style.Triggers>
            <Trigger Property="Tag" Value="True">
                <Setter Property="Foreground" Value="Red" />
            </Trigger>
        </Style.Triggers>
    </Style>
  

TemplatedParent работает внутри ControlTemplate. Ваша привязка неверна. Вот почему это не работает.

Если вы по какой-то причине хотите использовать DataTrigger, тогда правильная привязка будет

 <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Self}}" Value="True">
  

Ответ №2:

Просто измените привязку:

 Binding="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"
  

Комментарии:

1. Я только что узнал, что он работает с предложенной вами привязкой, но не работает Trigger . Похоже, он пытается сравнить логическое значение и строку и всегда возвращает false .

Ответ №3:

В первую очередь это происходит потому, что свойство тега имеет тип object, а не string . Решение, приведенное в ссылке ниже, может вам помочь:

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/d3424267-ed1f-4b30-90a1-5cca9843bd22

О текстовом блоке.Свойство тега: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tag.aspx