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
свойство не обновляется вообще ни для одной кнопки после первого нажатия кнопки.