Wpf: установка IsEnabled в коде за перерывами Style Trigger - PullRequest
2 голосов
/ 07 июля 2011

У меня возникла проблема при использовании DataTrigger для манипулирования свойством IsEnabled элемента управления. Обычно это работает нормально, однако, когда я инициализирую состояние IsEnabled в событии Initialized представления, динамическая стилизация больше не работает.

Вот мой код. Я сократил это до самого простого примера, который мог.

Почему это происходит, и что я могу сделать, чтобы позволить мне установить IsEnabled как с помощью триггера стиля, так и путем его инициализации в коде позади?

Заранее спасибо!

Вид:

(содержит текстовое поле, которое должно быть включено / отключено в зависимости от значения флажка)

<Window x:Class="IsEnabled.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Initialized="Window_Initialized">
    <StackPanel Orientation="Vertical">
        <TextBox x:Name="txtTarget" Width="200">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=ToggleValue}" Value="True">
                            <Setter Property="IsEnabled" Value="False" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
        <CheckBox x:Name="chkSource" IsChecked="{Binding Path=ToggleValue}" />
    </StackPanel>
</Window>

Просмотреть код позади:

(Единственное добавление - реализация события Initialized, устанавливающего начальное состояние для IsEnabled)

using System;
using System.Windows;

namespace IsEnabled.Views
{
    public partial class MainView : Window
    {
        public MainView()
        {
            InitializeComponent();
        }

        private void Window_Initialized(object sender, EventArgs e)
        {
            txtTarget.IsEnabled = false;
        }
    }
}

ViewModel:

(ViewModelBase содержит реализацию интерфейса INotifyPropertyChanged)

using System;

namespace IsEnabled.ViewModels
{
    class MainViewModel : ViewModelBase
    {
        private bool _ToggleValue;
        public bool ToggleValue
        {
            get { return _ToggleValue; }
            set
            {
                _ToggleValue = value;
                OnPropertyChanged(this, "ToggleValue");
            }
        }
    }
}

1 Ответ

2 голосов
/ 07 июля 2011

Посмотрите на приоритет значения свойства зависимости и на то, как меняются значения из разных мест: стили, триггеры, анимации и т. Д.

Добавьте в режим привязки = TwoWay, и он должен работать.

...