MVVM: привязка радио кнопок к модели представления?

РЕДАКТИРОВАТЬ: Проблема была исправлена ​​в .NET 4.0.

Я пытался связать группу переключателей с моделью представления, используяIsChecked кнопка. После просмотра других сообщений, кажется, чтоIsChecked собственность просто не работает. Я собрал короткую демонстрацию, которая воспроизводит проблему, которую я включил ниже.

Вот мой вопрос: существует ли простой и надежный способ привязки переключателей с помощью MVVM? Благодарю.

Дополнительная информация: IsChecked собственность не работает по двум причинам:

Когда кнопка выбрана, свойства IsChecked других кнопок в группе не устанавливаются вложный.

Когда кнопка выбрана, ее собственное свойство IsChecked не устанавливается после первого нажатия кнопки. Я предполагаю, что привязка становится разбитой WPF с первого клика.

Демо-проект: Вот код и разметка для простой демонстрации, которая воспроизводит проблему. Создайте проект WPF и замените разметку в Window1.xaml на следующую:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <StackPanel>
        <RadioButton Content="Button A" IsChecked="{Binding Path=ButtonAIsChecked, Mode=TwoWay}" />
        <RadioButton Content="Button B" IsChecked="{Binding Path=ButtonBIsChecked, Mode=TwoWay}" />
    </StackPanel>
</Window>

Замените код в Window1.xaml.cs следующим кодом (хак), который устанавливает модель представления:

using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = new Window1ViewModel();
        }
    }
}

Теперь добавьте следующий код в проект какWindow1ViewModel.cs:

using System.Windows;

namespace WpfApplication1
{
    public class Window1ViewModel
    {
        private bool p_ButtonAIsChecked;

        /// <summary>
        /// Summary
        /// </summary>
        public bool ButtonAIsChecked
        {
            get { return p_ButtonAIsChecked; }
            set
            {
                p_ButtonAIsChecked = value;
                MessageBox.Show(string.Format("Button A is checked: {0}", value));
            }
        }

        private bool p_ButtonBIsChecked;

        /// <summary>
        /// Summary
        /// </summary>
        public bool ButtonBIsChecked
        {
            get { return p_ButtonBIsChecked; }
            set
            {
                p_ButtonBIsChecked = value;
                MessageBox.Show(string.Format("Button B is checked: {0}", value));
            }
        }

    }
}

Чтобы воспроизвести проблему, запустите приложение и нажмите кнопку A. Появится окно сообщения о том, что кнопка AIsChecked свойство было установлено вправда, Теперь выберите кнопку B. Появится еще одно окно с сообщением о том, что кнопка BIsChecked свойство было установлено вправда, но нет сообщения о том, что кнопка АIsChecked свойство было установлено вложный- свойство не было изменено.

Теперь нажмите кнопку A еще раз. Кнопка будет выбрана в окне, но окно сообщения не появится -IsChecked свойство не было изменено. Наконец, нажмите кнопку B еще раз - тот же результат.IsChecked свойство не обновляется вообще ни для одной кнопки после первого нажатия кнопки.

Ответы на вопрос(11)

Ваш ответ на вопрос