Связывающие проблемы с RadioButton - PullRequest
4 голосов
/ 01 марта 2012

У меня, казалось бы, простая задача, которая вызывает у меня головную боль и я был бы признателен за некоторую помощь.

Я хочу выполнить привязку двух логических значений к свойству IsChecked двух RadioButton с, разделяяGroupName (поэтому проверяется только один).

Проблема, с которой я сталкиваюсь, заключается в том, что когда содержимое ContentPresenter собирается измениться (через привязку к SelectedItem ComboBox),Текущий контент получает вызов к Property-setter со значением того же свойства, но из модели представления, которая собирается стать новым контентом.(!) Конечным результатом является изменение модели представления, несмотря на отсутствие щелчка по RadioButton, привязанному к рассматриваемому свойству.

Я собрал вместе с примером приложения , котороепоказывает проблему.Для воспроизведения запустите приложение и выполните следующие действия:

  1. Выберите «Один» в поле со списком => MyPropery отмечен, MyProperty2 нет.
  2. Выберите «Три» в поле со списком=> MyPropery отмечен, MyProperty2 - нет.
  3. Пока выбран «Три», нажмите MyProperty2 => MyProperty2 отмечен (также отображается в окне вывода отладки)
  4. Выберите «Один»в выпадающем списке => MyPropery проверено, MyProperty2 нет. Обратите внимание, как в окне отладки показано, как для MyProperty2 объекта «Три» установлено значение false здесь
  5. Выберите «Три» в поле со списком => Ни одна из радиокнопок теперь не проверена (из-за #4).

Если между # 3 и # 4 вы сначала выбираете «Два» в выпадающем списке, чтобы ContentPresenter отображал другое представление (как выбрано с помощью DataTemplate), проблема не возникает!?

Может кто-нибудь объяснить, почему свойство устанавливается на шаге # 4, когда ContentPresenter обменивается представлениями, и что с этим можно сделать?

Ответы [ 2 ]

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

Шаблоны данных кэшируются, поэтому как One, так и Three используют одинаковые UserControl. В этом можно убедиться, добавив событие Loaded к элементу управления и переключившись между опциями.

Когда вы переключаетесь на Two и обратно на Three, WPf просто перерисовывает элемент из кэша, однако, переключаясь на One и обратно на Three, он меняет DataContext за объектом , Я думаю, что это вызывает проблему, потому что кажется, что он очищает 2-й RadioButton IsChecked перед удалением DataContext, так что в результате Property2 устанавливается в false. Этого не происходит, если для One и Three выбрана 2-я кнопка-переключатель.

Обычно в такой ситуации у меня будет виртуальная машина, содержащая ObservableCollection<T> Items и int SelectedIndex. Затем я нарисую пользовательский интерфейс, используя ListBox, который был перезаписан для использования RadioButton для элементов. Таким образом, за один раз можно выбрать только один элемент, а для хранения выбранного элемента есть только одно свойство.

0 голосов
/ 01 марта 2012

Кажется, это ошибка (содержимое ContentPresenter изменяется, а DataContext - нет).

Но я могу предложить вам решение. В вашем примере сделайте следующее (MainWindow.xaml):

<StackPanel>
     <ComboBox ItemsSource="{Binding MyItems, Mode=OneWay}" Name="cmbBox" DisplayMemberPath="ID" SelectionChanged="cmbBox_SelectionChanged"/>
     <ContentPresenter Name="cp1" />
</StackPanel>

В cmbBox_SelectionChanged выглядит следующее:

private void cmbBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    cp1.Content = null;
    cp1.DataContext = null;
    cp1.Content = cmbBox.SelectedItem;
}

Это решает проблему (не отличное решение, но обходной путь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...