2011-02-10 3 views
3

Это немного странная проблема. (.NET 3.5sp1)WPF ToggleButton binding IsChecked when disabled

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

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

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

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

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

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

ответ

2

То же странно проблема происходит в .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

На самом деле я мог бы упрощенно - IsEnabled это связано данные, но не непосредственно на пользовательский элемент управления, это на элемент выше дерево. Но этот хак действительно сработал, после того как он настроил правильный DataContext (я всегда ставил внутренние контексты для первого ребенка, а не из самого UserControl. В противном случае они могут получить переопределение извне, что становится беспорядочным). – Miral

0

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

WPF ToggleButton incorrect render behavior

Приветствия

Мансур

Смежные вопросы