2009-10-29 7 views
1

Est-il raisonnable de supposer que la liaison de données WPF TwoWay Wont fonctionne sur des contrôles qui n'ont pas de focus?Limitation de liaison de données WPF TwoWay

Par exemple dans le code suivant.

<Window.Resources> 
     <XmlDataProvider x:Key="TestBind1" XPath="/BindTest1"> 
      <x:XData> 
       <BindTest1 xmlns=""> 
        <Value1>True</Value1> 
       </BindTest1> 
      </x:XData> 
     </XmlDataProvider> 
    </Window.Resources> 
    <StackPanel> 
     <GroupBox> 
      <StackPanel> 
       <RadioButton Content="Value1" IsChecked="{Binding Source={StaticResource TestBind1},Mode=TwoWay, XPath=Value1}"/> 
       <RadioButton Content="Value2"/> 
      </StackPanel> 
     </GroupBox> 
     <Button Content="Analyse" Click="OnAnalyseClicked"/> 

    </StackPanel> 

Lorsque je clique sur le bouton radio Valeur2, la valeur de BindTest1/Valeur1 restera vrai parce RadioButton Valeur1 changé alors qu'il na pas avoir le focus?

Est-ce un comportement normal pour WPF? Je suis conscient que je peux éviter cela en utilisant diverses techniques, mais je voulais demander si c'est normal ou si mon Xaml manque un paramètre causant ce problème.

Répondre

1

Enfin, j'ai trouvé une réponse. Fondamentalement, la liaison plantera pour RadioButtons parce que chaque fois que vous changez de sa liaison, les radiobuttons vont changer l'état vérifié des autres boutons du groupe

J'ai trouvé la réponse here, qui est spécialisée RadioButton et empêcher la liaison de être changé. Exemple de classe que j'ai utilisé pour fixer la liaison.

/// <summary> 
    /// data bound radio button 
    /// </summary> 
    public class DataBoundRadioButton : RadioButton 
    { 
     /// <summary> 
     /// Called when the <see cref="P:System.Windows.Controls.Primitives.ToggleButton.IsChecked"/> property becomes true. 
     /// </summary> 
     /// <param name="e">Provides data for <see cref="T:System.Windows.RoutedEventArgs"/>.</param> 
     protected override void OnChecked(RoutedEventArgs e) 
     { 
      // Do nothing. This will prevent IsChecked from being manually set and overwriting the binding. 
     } 

     /// <summary> 
     /// Called by the <see cref="M:System.Windows.Controls.Primitives.ToggleButton.OnClick"/> method to implement a <see cref="T:System.Windows.Controls.RadioButton"/> control's toggle behavior. 
     /// </summary> 
     protected override void OnToggle() 
     { 
      BindingExpression be = GetBindingExpression(RadioButton.IsCheckedProperty); 
      Binding bind = be.ParentBinding; 

      Debug.Assert(bind.ConverterParameter != null, "Please enter the desired tag as the ConvertParameter"); 

      XmlDataProvider prov = bind.Source as XmlDataProvider; 
      XmlNode node = prov.Document.SelectSingleNode(bind.XPath); 
      node.InnerText = bind.ConverterParameter.ToString(); 

     } 
    } 
1

Les liaisons seront mises à jour, que les contrôles aient ou non un focus. Ma conjecture est que quelque chose d'autre est faux dans votre XAML.