【问题标题】:Style template does not reevaluate when Data updates数据更新时样式模板不会重新评估
【发布时间】:2010-12-27 07:34:39
【问题描述】:

我的样式模板(如下)在我的标签绑定更新时不会更新。数据本身会更新,我没有收到任何绑定错误,所以希望一切都正确绑定,只是样式似乎根本没有更新。我在所有正确的地方都有 notifypropertychanged 事件 afaik 所以怀疑这是问题所在。

谢谢

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

【问题讨论】:

    标签: wpf xaml .net-3.5 binding


    【解决方案1】:

    标签是对象类型。我认为您的 Viewmodel 为它提供了一个布尔值。 WPF 能够在字符串和对象之间进行转换,但似乎不能在 bool 和对象之间进行转换。一种解决方案是使用 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
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      干杯,
      浆果

      【讨论】:

        猜你喜欢
        • 2016-04-22
        • 1970-01-01
        • 2011-05-06
        • 2014-03-04
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        相关资源
        最近更新 更多