#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