2010-09-20 12 views
7

Je suis lié la DataContext de la fenêtre ci-dessous pour le code derrière pour me donner un MVVM style pour démontrer ce comportement:boutons radio WPF - MVVM - la liaison semble mourir?

<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" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <StackPanel> 
     <RadioButton GroupName="test" Content="Monkey" IsChecked="{Binding IsMonkey}"/> 
     <RadioButton GroupName="test" Content="Turtle" IsChecked="{Binding IsTurtle}" /> 
    </StackPanel> 
</Window> 

Heres le code derrière:

public partial class Window1 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private bool _isMonkey; 
    public bool IsMonkey 
    { 
     get { return _isMonkey; } 
     set 
     { 
      _isMonkey = value; 
     } 
    } 

    private bool _isTurtle; 
    public bool IsTurtle 
    { 
     get { return _isTurtle; } 
     set 
     { 
      _isTurtle = value; 
     } 
    } 
} 

Mettre un point d'arrêt sur l'ensemble de IsMonkey et IsTurtle puis en exécutant l'application et en sélectionnant IsMonkey et IsTurtle après l'autre, j'ai trouvé que cela fonctionne pour la première sélection de chaque contrôle, sur la deuxième sélection la liaison b les reaks et les points de rupture ne sont plus déclenchés?

Quelqu'un peut-il me diriger dans la bonne direction, s'il vous plaît?

Répondre

10

Votre exemple n'a pas de notification modifiée. Vous avez écrit que c'est seulement un exemple pour une construction de style MVVM. Par conséquent, je suppose que vous avez implémenté INotifyPropertyChanged ou que les propriétés sont DependencyProperties. Si ce n'est pas le cas, la première chose à faire est de changer de notification.

Si vous avez une notification de modification, attribue aux différents noms de groupe de RadioButtons (un autre nom pour chaque instance). Cela les découplera et la reliure ne sera plus brisée.

<StackPanel> 
    <RadioButton GroupName="test1" Content="Monkey" IsChecked="{Binding IsMonkey}"/> 
    <RadioButton GroupName="test2" Content="Turtle" IsChecked="{Binding IsTurtle}" /> 
</StackPanel> 

Selon la déclaration de vos propriétés, il peut également être meaningfull de déclarer la liaison TwoWay.

IsChecked="{Binding IsMonkey,Mode=TwoWay} 

Espérons que cela a aidé.

+0

Salut, merci - je l'ai eu à travers différents noms de groupe comme vous l'avez suggéré et du code sur les propriétés. C'est ennuyeux, car c'est le même groupe - donc je voulais utiliser cette fonctionnalité, mais il ne me laisse pas. –

+0

'donner aux RadioButtons différents noms de groupe' Mon Dieu, Vous avez sauvé mes fesses. – user1112008

2

Ceci est un problème connu avec les boutons radio WPF; vérifier ces messages pour plus de détails et des solutions de contournement -

RadioButtons WPF et liaison de données: http://geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspx

Parcimonie WPF bouton radio de liaison (énumérations et corrections de bugs): http://inquisitorjax.blogspot.com/2009/02/wpf-radio-button-binding-enums-and-bug.html

RadioButton liaisons non vérifiées problème toujours pas résolu? http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8eb8280a-19c4-4502-8260-f74633a9e2f2/

+0

Merci pour l'info. –

0

Ce problème a été corrigé dans WPF 4.0, j'utilise ce comportement dans mon propre projet dès maintenant. Placez simplement les boutons radio dans le même groupe, vous n'avez plus besoin d'utiliser des noms de groupes différents. Les liaisons ne seront pas brisées ... en fait, le bouton radio "désélectionné" aura sa valeur liée définie sur false comme prévu.