J'ai lié deux boutons radio dans ma fenêtre Child
à un Enum
dans mon ViewModel
qui est construit dans la fenêtre principale. La liaison fonctionne comme prévu mais j'ai remarqué un comportement très étrange que je ne peux pas résoudre. J'ai fourni tout le code ici afin que vous puissiez facilement reconstruire le problème pour vous-même.Comportement impair lors de la tentative de modification d'un RadioButton lié dans WPF
Voici les étapes pour voir ce comportement étrange:
- Cliquez sur le bouton dans la MainWindow
- Le ChildWindow ouvre et le RadioButton est réglé sur l'utilisateur
- Choisissez Automatique puis choisissez à nouveau l'utilisateur
- Fermez ChildWindow et rouvrez-le à nouveau! Essayez de changer le
RadioButton
en automatique. Cela ne changera pas!
<Window x:Class="RadioButtonBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Button Content="Display Child Window" Click="DisplayChildWindow"/>
</Window>
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
var viewModel = new ViewModel();
DataContext = viewModel;
}
private void DisplayChildWindow(object sender, RoutedEventArgs e)
{
var win = new ChildWindow {DataContext = (ViewModel) DataContext};
win.ShowDialog();
}
}
<Window x:Class="RadioButtonBinding.ChildWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:radioButtonBinding="clr-namespace:RadioButtonBinding"
Title="ChildWindow" Height="300" Width="300">
<Window.Resources>
<radioButtonBinding:EnumBooleanConverter x:Key="EnumBooleanConverter"/>
</Window.Resources>
<StackPanel>
<RadioButton Content="Automatic"
GroupName="CalcMode"
IsChecked="{Binding Path=CalcMode,
Converter={StaticResource EnumBooleanConverter},
ConverterParameter={x:Static radioButtonBinding:CalcMode.Automatic}}"/>
<RadioButton Content="Custom"
GroupName="CalcMode"
IsChecked="{Binding Path=CalcMode,
Converter={StaticResource EnumBooleanConverter},
ConverterParameter={x:Static radioButtonBinding:CalcMode.User}}"/>
</StackPanel>
</Window>
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private CalcMode calcMode = CalcMode.User;
public CalcMode CalcMode
{
get { return calcMode; }
set
{
calcMode = value;
RaisePropertyChanged("CalcMode");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class EnumBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var paramEnum = parameter as Enum;
var valueEnum = value as Enum;
return Equals(paramEnum, valueEnum);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var parameterEnum = parameter as Enum;
if (parameterEnum == null)
return DependencyProperty.UnsetValue;
return parameterEnum;
}
}
public enum CalcMode : byte
{
Automatic,
User,
}
MISE À JOUR:
Je suppose que ce doit être le Converter
mais je ne sais pas pourquoi? Il tombe juste dans une boucle.
Une raison particulière pour laquelle 'enum' hérite de' byte'? – Jammer
@Jammer Non, pourquoi? mais ça ne marche pas même si je n'hérite pas. – Vahid
Avoir une lecture de ceci http://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/ – Jammer