Wpf 数据更新时,样式模板不会重新计算
我有一个样式模板(如下),在标记绑定更新时不会更新。数据本身会更新,我没有收到任何绑定错误,因此希望所有内容都能正确绑定,只是样式似乎根本没有更新。我已经在所有正确的地方通知了PropertyChanged事件,所以我怀疑这是问题所在 谢谢Wpf 数据更新时,样式模板不会重新计算,wpf,xaml,.net-3.5,binding,Wpf,Xaml,.net 3.5,Binding,我有一个样式模板(如下),在标记绑定更新时不会更新。数据本身会更新,我没有收到任何绑定错误,因此希望所有内容都能正确绑定,只是样式似乎根本没有更新。我已经在所有正确的地方通知了PropertyChanged事件,所以我怀疑这是问题所在 谢谢 <Style x:Key="CompareTemplate" TargetType="TextBlock"> <!--Setter Property="Foreground" Value="#FF760000"
<Style x:Key="CompareTemplate" TargetType="TextBlock">
<!--Setter Property="Foreground" Value="#FF760000" /-->
<Setter Property="Foreground" Value="#FFBCBCBC" />
<Style.Triggers>
<Trigger Value="True" Property="Tag">
<Setter Property="Foreground" Value="#FF007602" />
</Trigger>
<Trigger Value="False" Property="Tag">
<Setter Property="Foreground" Value="#FF760000" />
</Trigger>
</Style.Triggers>
</Style>
我这样使用这个模板:
<TextBlock Style="{DynamicResource CompareTemplate}" Tag="{Binding UnitComparer.CommsID, FallbackValue=True}" Text="Comms ID:" />
标记的类型为object。我认为你的视图模型对它很有帮助。WPF能够在字符串和对象之间转换,但似乎不能在bool和对象之间转换。一种解决方案是使用IValueConverter将布尔值更改为字符串:
<Window x:Class="BindToTagSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindToTagSpike"
Title="Window1" Height="300" Width="300">
<StackPanel>
<StackPanel.Resources>
<local:ObjectToString x:Key="ObjectToString"/>
<Style x:Key="CompareTemplate" TargetType="TextBlock">
<Style.Triggers>
<Trigger Value="True" Property="Tag">
<Setter Property="Foreground" Value="Red" />
</Trigger>
<Trigger Value="False" Property="Tag">
<Setter Property="Foreground" Value="YellowGreen" />
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Style="{StaticResource CompareTemplate}"
Name="TaggedTextBlock"
Tag="{Binding TagValue,
Converter={StaticResource ObjectToString}}"/>
<Button Click="Button_Click">Change Style</Button>
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Data;
using System.ComponentModel;
namespace BindToTagSpike
{
public partial class Window1 : Window, INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
tagValue = false;
TaggedTextBlock.Text = "Test";
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TagValue=!TagValue;
}
private bool tagValue;
public bool TagValue
{
get { return tagValue; }
set
{
tagValue = value;
if (PropertyChanged != null)
PropertyChanged(this,new PropertyChangedEventArgs("TagValue"));
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
public class ObjectToString : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}
改变风格
使用制度;
使用System.Windows;
使用System.Windows.Data;
使用系统组件模型;
名称空间BindToTagSpike
{
公共部分类Window1:Window,INotifyPropertyChanged
{
公共窗口1()
{
初始化组件();
tagValue=false;
TaggedTextBlock.Text=“测试”;
DataContext=this;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
TagValue=!TagValue;
}
私有布尔值;
公共布尔值
{
获取{return tagValue;}
设置
{
tagValue=值;
if(PropertyChanged!=null)
PropertyChanged(即新PropertyChangedEventArgs(“TagValue”);
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
#端区
}
公共类ObjectToString:IValueConverter
{
#区域转换器成员
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值.ToString();
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
#端区
}
}
当模板/样式未按预期应用时,WPF可能认为TargetType可能与控件类型不匹配。尝试下面的代码,看看这是否有帮助:
<Style x:Key="CompareTemplate" >
<!--Setter Property="Control.Foreground" Value="#FF760000" /-->
<Setter Property="Control.Foreground" Value="#FFBCBCBC" />
<Style.Triggers>
<Trigger Value="True" Property="Control.Tag">
<Setter Property="Control.Foreground" Value="#FF007602" />
</Trigger>
<Trigger Value="False" Property="Control.Tag">
<Setter Property="Control.Foreground" Value="#FF760000" />
</Trigger>
</Style.Triggers>
</Style>
干杯,贝里尔