WPF и привязка данных

У меня есть приложение WPF, в котором я хочу управлять свойством IsEnabled нескольких текстовых полей в коде, установив только одно логическое значение. Поэтому я решил добавить привязку данных для свойства IsEnabled текстовых полей. Вот определение исходного объекта:

<Window.Resources>
     <src:QuestionControlsState x:Key="QuestionContorlsState" IsEnabled="True"/>
</Window.Resources>

Где простой класс «QuestionControlsState» только с одним общедоступным свойством «IsEnabled». Затем я привязываю некоторые текстовые поля:

<TextBox Name="textBoxQuestion" 
                IsEnabled="{Binding Path=IsEnabled, Source={StaticResource QuestionContorlsState}}">

На данный момент он работает нормально, когда я меняю атрибут IsEnabled в разделе Window.Resources, привязка данных работает. Но я хочу управлять им из кода, поэтому я получаю исходный объект:

 QuestionControlsState _questionControlsState = (QuestionControlsState)this.FindResource("QuestionContorlsState");

И теперь, когда я пытаюсь установить _questionControlsState.IsEnabled, состояние текстового поля не меняется, и теперь на выходе появляются предупреждения.


person igorGIS    schedule 14.01.2013    source источник


Ответы (4)


Не видя вашего кода, я предполагаю, что ваш класс QuestionControlsState не реализует INotifyPropertyChanged.

Измените его следующим образом:

public class QuestionControlsState : INotifyPropertyChanged
{
    private bool isEnabled = true;
    public bool IsEnabled
    {
        get { return isEnabled; }
        set
        {
            isEnabled = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("IsEnabled"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Это вызовет событие PropertyChanged всякий раз, когда вы изменяете свойство IsEnabled, уведомляя представление, которое необходимо обновить.

Конечно, если вы используете шаблон MVVM, правильный способ сделать это — привязать все текстовые поля к логическому свойству IsEnabled в ViewModel, а не пытаться найти статический ресурс в отделенном коде... Затем простой IsEnabled = false в виртуальной машине отключит все текстовые поля (без необходимости использования статического ресурса)

person Blachshma    schedule 14.01.2013

Используйте шаблон MVVM для передачи данных в представление XAML, а также для инкапсуляции логики представления и обеспечения возможности проверки логики представления.

С помощью MVVM очень легко создать наблюдаемое свойство, которое можно привязать к свойствам IsEnabled ваших элементов управления. . Вам нужно только изменить свойство с помощью команды на true или false, чтобы включить или отключить свойство.

person Juergen Gutsch    schedule 14.01.2013

Спасибо, ребята, Блахшма, вы были правы, я забыл реализовать интерфейс INotifyPropertyChanged в своем пользовательском классе, и теперь он работает так, как должен. Спасибо! Я думаю о шаблоне MVVM, и он выглядит круто, но я только начал работать с WPF и хочу изучить основы.

person igorGIS    schedule 14.01.2013

Вы можете попробовать изменить StaticResource на DynamicResource.

Информацию можно найти здесь

person Colin    schedule 14.01.2013