EDIT: Проблема была исправлена в .NET 4.0.
Я пытаюсь связать группу переключателей с моделью просмотра с помощью кнопки IsChecked
. После просмотра других сообщений кажется, что свойство IsChecked
просто не работает. Я собрал короткую демоверсию, которая воспроизводит проблему, которую я включил ниже.
Вот мой вопрос: есть ли простой и надежный способ привязки переключателей с помощью MVVM? Спасибо.
Дополнительная информация: Свойство IsChecked
не работает по двум причинам:
-
Если выбрана кнопка, свойства IsChecked других кнопок в группе не будут установлены в false.
-
Когда выбрана кнопка, ее собственное свойство 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. Появится окно с сообщением о том, что для свойства Button A IsChecked
установлено значение true. Теперь выберите Button B. Появится другое окно сообщения, в котором указано, что для свойства Button B IsChecked
установлено значение true, но нет окна сообщения, указывающего, что для свойства Button A IsChecked
установлено значение false - свойство hasn ' t изменено.
Теперь снова нажмите кнопку A. Кнопка будет выбрана в окне, но не появится окно сообщения - свойство IsChecked
не было изменено. Наконец, снова нажмите кнопку B - тот же результат. Свойство IsChecked
не обновляется вообще ни для одной из кнопок после первого нажатия кнопки.