数据更新时,样式模板不会重新评估

时间:2009-12-16 16:29:37

标签: wpf xaml .net-3.5 binding

我有一个样式模板(下面),当我的标签绑定更新时,它不会更新。数据本身更新,我没有收到绑定错误,所以期望一切正确绑定只是风格似乎根本没有更新。我没有在所有正确的地方改变事件,所以怀疑这是问题。

由于

  <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:" />

2 个答案:

答案 0 :(得分:1)

标签属于对象类型。我认为你的Viewmodel会给它带来麻烦。 WPF能够在字符串和对象之间进行转换,但看起来不在bool和object之间。一种解决方案是使用IValueConverter将bool更改为字符串:

<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
    }
}

答案 1 :(得分:1)

有时,如果未按预期应用模板/样式,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>

干杯,
Berryl