2012-03-01 3 views
4

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

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

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

Я поставил together a sample app, что указывает на проблему. Чтобы воспроизвести, запустите приложение и выполните следующие действия:

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

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

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

ответ

1

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

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

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

+0

+1. Рейчел абсолютно прав: сгенерированные UIElements DataTemplate кэшируются, и ваша CheckBox Grouping в пользовательском интерфейсе запускается в ViewModel, испортив ваши флажки. – SvenG

+0

Итак, в основном, GroupName и MVVM/DataTemplates не смешиваются. :(Я не могу использовать решение ListBox, потому что я должен поместить RadioButtons, отделенные от eachother. Я предполагаю, что мне придется использовать регулярные флажки вместо этого и обрабатывать Группировку в VM вместо этого. Спасибо за помощь. – Per

0

Кажется, что это ошибка (содержимое 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; 
} 

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

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