2016-07-18 6 views
1

zu ändern Ich habe zwei Radiobuttons in meinem Child Fenster an eine Enum in meinem ViewModel gebunden, die im Hauptfenster erstellt wird. Die Bindung funktioniert wie erwartet, aber ich habe ein sehr merkwürdiges Verhalten bemerkt, das ich nicht lösen kann. Ich habe den ganzen Code hier zur Verfügung gestellt, damit Sie das Problem leicht für sich selbst rekonstruieren können.Odd Verhalten beim Versuch, eine gebundene RadioButton in WPF

Hier sind die Schritte, um dieses seltsame Verhalten zu sehen:

  1. Klicken Sie auf die Schaltfläche in der Mainwindow
  2. Die Childwindow öffnet sich und der Radiobutton wird auf Benutzer
  3. Automatisches Wählen und dann wieder Wählen Sie Benutzer
  4. Schließen Sie das ChildWindow und öffnen Sie es erneut! Versuchen Sie, die RadioButton in Automatisch zu ändern. Es wird sich nicht ändern!
<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, 
    } 

UPDATE:

Ich vermute, es muss die Converter sein, aber ich weiß nicht warum? Es fällt nur in eine Schleife.

+0

Gibt es einen besonderen Grund, warum Ihre 'enum'' Byte' erbt? – Jammer

+1

@Jammer Nein, warum? aber es funktioniert nicht, auch wenn ich nicht erben. – Vahid

+0

Lesen Sie diese http://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/ – Jammer

Antwort

1

BEARBEITEN Wie wäre es mit der Umwandlung der Enum zu Bool wie folgt?

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

Aber das funktioniert nicht. In meinem 'ViewModel' habe ich den Wert als' Enum' definiert, also muss ich ConvertBack in en Enum konvertieren. – Vahid

+0

Danke. Das funktioniert. – Vahid