WPF ToggleButton привязка IsChecked при отключении - PullRequest
3 голосов
/ 11 февраля 2011

Это немного странная проблема.(.NET 3.5sp1)

У меня есть UserControl, содержащий три кнопки ToggleButton, каждый из которых IsChecked привязан к разным свойствам зависимости самого UserControl.Два из них по умолчанию имеют значение true, один по умолчанию - false.

При запуске приложения сам UserControl (и, следовательно, его содержимое) отключается.Когда он включается позже, все три кнопки появляются не нажатыми;однако свойства кода все еще находятся в правильном состоянии.

Если кнопки нажимаются, свойства переключаются правильно, и пользовательский интерфейс (только для этой кнопки) обновляется, чтобы отображать правильное состояние (т. е. нажатиекнопка, которая отображается не нажатой, но имеет истинное значение привязки, в первый раз не отображает видимых изменений, но изменяет значение привязки на false).Повторное нажатие «сбитой» кнопки будет вести себя нормально (при ее включении кнопка будет нажата, как и ожидалось).

Если при запуске пользовательский контроль не отключен, то кнопки будут отображаться правильно (в соответствии с состоянием свойств).

К сожалению, UserControl должен быть отключен при запуске, поэтому я не могу запустить его с включенным;Я надеюсь на альтернативное решение.Любые идеи?

(Я пытался установить для свойств значение по умолчанию false и затем установить их значение true в событии Load пользовательского элемента управления. Не имеет значения.)

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Та же странная проблема возникает и в .NET 4.0. Я заметил, что проблема возникает только в том случае, если вы устанавливаете IsEnabled с помощью кода, а не если вы связываете его, поэтому, если вы вместо этого можете изменить свой код, я считаю, что ваша проблема будет решена.

В противном случае, я считаю, что обходной путь необходим, и вот один из способов сделать это. Сброс DataContext для UserControl, когда IsEnabled в первый раз установлен на True.

public UserControl1()
{
    InitializeComponent();

    DependencyPropertyDescriptor descriptor =
        DependencyPropertyDescriptor.FromProperty(UserControl1.IsEnabledProperty, 
                                                  typeof(UserControl1));
    EventHandler isEnabledChanged = null;
    isEnabledChanged = new EventHandler(delegate
    {
        if (IsEnabled == true)
        {
            descriptor.RemoveValueChanged(this, isEnabledChanged);
            var dataContext = this.DataContext;
            this.DataContext = null;
            this.DataContext = dataContext;
        }
    });
    descriptor.AddValueChanged(this, isEnabledChanged);
}
0 голосов
/ 31 декабря 2014

Я столкнулся с «несколько» подобной ситуацией, и следующий ответ SO оказался более подходящим в моем случае.Это избавило меня от многих неприятностей, и поэтому, на всякий случай, если кто-то, глядя на это решение, не заметил его, я думаю, что ссылка на него должна быть здесь полезной.

WPF ToggleButton некорректное поведение рендеринга

Приветствия

Мансур

...