Шаблон стиля не переоценивается при обновлении данных - PullRequest
0 голосов
/ 16 декабря 2009

У меня есть шаблон стиля (ниже), который не обновляется при обновлении привязки тега. Сами данные обновляются, и я не получаю ошибок связывания, так что ожидайте, что все связано правильно, просто кажется, что стиль вообще не обновляется. Я уведомляю о событиях, произошедших по праву собственности, во всех нужных местах, поэтому сомневаюсь, что это проблема.

Спасибо

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

1 голос
/ 16 декабря 2009

Иногда, когда ваш шаблон / стиль не применяется должным образом, 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

1 голос
/ 16 декабря 2009

Тег имеет тип объекта. Я думаю, что твоя 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
    }
}
...