2016-07-18 1 views
1

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:

  1. Cliquez sur le bouton dans la MainWindow
  2. Le ChildWindow ouvre et le RadioButton est réglé sur l'utilisateur
  3. Choisissez Automatique puis choisissez à nouveau l'utilisateur
  4. 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.

+0

Une raison particulière pour laquelle 'enum' hérite de' byte'? – Jammer

+1

@Jammer Non, pourquoi? mais ça ne marche pas même si je n'hérite pas. – Vahid

+0

Avoir une lecture de ceci http://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/ – Jammer

Répondre

1

EDIT Qu'en est-il de la conversion de l'énumération en bool comme suit?

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (parameter == null || !(bool)value) 
     return DependencyProperty.UnsetValue; 
    var parameterEnum = parameter as Enum; 

    return parameterEnum; 
} 
+0

Mais cela ne fonctionne pas. Dans mon 'ViewModel' j'ai défini la valeur comme un' Enum' donc je dois ConvertBack en en Enum. – Vahid

+0

Merci. Cela marche. – Vahid