Почему свойство Tag не обновляется? - PullRequest
0 голосов
/ 03 марта 2012

В приведенном ниже коде, когда в поле со списком вводится недопустимое значение (например, «a»), генерируется исключение, и WPF устанавливает для Validation.HasError значение true. Триггер комбинированного списка покорно устанавливает синий цвет фона. Тем не менее, я ожидаю, что свойство Tag также будет установлено в значение «true», и, поскольку оно связано с B в базовом текстовом тексте данных, можно ожидать, что B также будет обновлено до «true». Однако я понимаю, что при сбое проверки механизм привязки останавливается и не запускает никаких преобразователей - приведенный ниже метод ConvertBack вообще не вызывается.

Однако утилита snoop показывает Tag как оставшийся со своим значением по умолчанию (заданным свойством B в текстовом тексте).

Любое понимание того, почему это будет высоко ценится.

<Window
x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Style TargetType="ComboBox">
        <Style.Triggers>
            <Trigger Property = "Validation.HasError" Value = "true">
                <Setter Property="Tag" Value="true"/>
                <Setter Property="Background" Value="Blue"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <ComboBox Height="23" IsEditable="True" Name="comboBox1" Width="120"   
              Tag="{Binding Path=B, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}"
            Text="{Binding Path=A, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>
</StackPanel>

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContextClass dataContext = new DataContextClass ();
            this.DataContext = dataContext ;

        }

    }

    public class DataContextClass : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged = delegate { };
            private string b = "default";
            public string B
            {
                get { return b; }
                set
                {
                    b = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("B"));
                }
            }

            private int a;
            public int A
            {
                get { return a; }
                set
                {
                    a = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("A"));
                }
            }
        }


 public class MyConverter : IValueConverter
    {
        #region Public Methods

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value as string;
        }

        #endregion
    }

1 Ответ

1 голос
/ 03 марта 2012

Это просто из-за приоритета свойства зависимости. Вы установили локальное значение для свойства Tag, которое имеет приоритет над триггером стиля. Background, с другой стороны, локальное значение не указано, поэтому значение, установленное триггером стиля, становится действующим значением.

См. Значение свойства зависимости Приоритет в MSDN.

...