2010-09-08 10 views
0

Essayer de faire fonctionner la liaison des boutons radio mais obtenir une erreur d'exécution avec le code ci-dessous. Vous voulez que les boutons radio agissent de telle sorte qu'un seul peut être sélectionné à la fois, et qu'ils se lient correctement d'une manière bidirectionnelle. Le texte d'erreur est.Liaison de bouton radio WPF - Vous obtenez une erreur dans ce code ici?

"L'invocation du constructeur sur type 'testapp1.MainWindow' qui correspond aux contraintes de liaison spécifiées ont jeté une exception"

<Window x:Class="testapp1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:l="clr-namespace:testapp1" Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.Resources> 
      <l:EnumBooleanConverter x:Key="enumBooleanConverter" /> 
     </Grid.Resources> 

     <StackPanel > 
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=FirstSelection}">first selection</RadioButton> 
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=TheOtherSelection}">the other selection</RadioButton> 
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=YetAnotherOne}">yet another one</RadioButton> 
      <Label Content="{Binding Path=VeryLovelyEnum}" Height="28" Name="label1" /> 
     </StackPanel> 

    </Grid> 
</Window> 

Et le code:

namespace testapp1 
{ 
    public partial class MainWindow : Window 
    { 
     public TestModel _model; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      InitializeComponent(); 
      _model = new TestModel(); 
      this.DataContext = _model; 
     } 

    } 

    public enum MyLovelyEnum 
    { 
     FirstSelection, 
     TheOtherSelection, 
     YetAnotherOne 
    }; 


    public class TestModel : DependencyObject 
    { 

     public MyLovelyEnum VeryLovelyEnum 
     { 
      get { return (MyLovelyEnum)GetValue(VeryLovelyEnumProperty); } 
      set { SetValue(VeryLovelyEnumProperty, value); } 
     } 
     public static readonly DependencyProperty VeryLovelyEnumProperty = 
      DependencyProperty.Register("VeryLovelyEnum", typeof(MyLovelyEnum), typeof(TestModel), new UIPropertyMetadata(0)); 



    // from http://stackoverflow.com/questions/397556/wpf-how-to-bind-radiobuttons-to-an-enum 
    public class EnumBooleanConverter : IValueConverter 
    { 
     #region IValueConverter Members 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      string parameterString = parameter as string; 
      if (parameterString == null) 
       return DependencyProperty.UnsetValue; 

      if (Enum.IsDefined(value.GetType(), value) == false) 
       return DependencyProperty.UnsetValue; 

      object parameterValue = Enum.Parse(value.GetType(), parameterString); 

      return parameterValue.Equals(value); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      string parameterString = parameter as string; 
      if (parameterString == null) 
       return DependencyProperty.UnsetValue; 

      return Enum.Parse(targetType, parameterString); 
     } 
     #endregion 
    } 

} 

Le bouton & étiquette est là d'un test précédent que j'ai fait - je juste le ft in ...

Répondre

2

La déclaration suivante utilise un entier au lieu d'une valeur enum par défaut. Peut-être votre problème instanciation ...

public static readonly DependencyProperty VeryLovelyEnumProperty = 
      DependencyProperty.Register("VeryLovelyEnum", typeof(MyLovelyEnum), typeof(TestModel), new UIPropertyMetadata(0)); 

Essayez quelque chose comme ...

public static readonly DependencyProperty VeryLovelyEnumProperty = 
      DependencyProperty.Register("VeryLovelyEnum", typeof(MyLovelyEnum), typeof(TestModel), new UIPropertyMetadata(MyLovelyEnum.FirstSelection));