2010-02-04 6 views
0

Je rencontre des problèmes pour obtenir une liste de radiobutton databound dans WPF pour répondre à l'entrée utilisateur et refléter les modifications apportées aux données auxquelles elle est liée (c'est-à-dire apporter des modifications au code). Le côté d'entrée de l'utilisateur fonctionne bien (c'est-à-dire que je peux sélectionner un radiobutton et la liste se comporte comme prévu). Mais chaque tentative de modification de la sélection dans le code échoue. En silence (c'est-à-dire sans exception).WPF Databound RadioButton ListBox

Voici la section pertinente du XAML (je pense):

<Setter Property="ItemContainerStyle"> 
<Setter.Value> 
    <Style TargetType="{x:Type ListBoxItem}" > 
     <Setter Property="Margin" Value="2" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border Name="theBorder" Background="Transparent"> 
        <RadioButton Focusable="False" IsHitTestVisible="False" 
         IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" > 
         <ContentPresenter /> 
        </RadioButton> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Setter.Value> 

Je lie la ListBox à une liste d'objets SchoolInfo. SchoolInfo contient une propriété appelée IsSelected:

public bool IsSelected 
    { 
     get { return isSelected; } 

     set 
     { 
      if(value != isSelected) 
      { 
       isSelected = value; 
       this.OnPropertyChanged("IsSelected"); 
      } 
     } 
    } 

Les choses OnPropertyChanged() était quelque chose que je mets dans mon cours d'expérimentation. Cela ne résout pas le problème.

Des choses comme les suivantes échouent:

((SchoolInfo) lbxSchool.Items[1]).IsSelected = true; 
lbxSchool.SelectedIndex = 1; 

Ils ne en silence - aucune exception est levée, mais l'interface ne montre pas l'élément sélectionné.

  • Mark

Répondre

0

Je NotifyOnSourceUpdated activer dans votre RadioButton obligatoire. Même si vous autorisez une liaison bidirectionnelle (qui est la valeur par défaut), les notifications ne seront pas récupérées à partir des modifications de code, sauf si vous les écoutez explicitement.

<RadioButton Focusable="False" IsHitTestVisible="False" 
        IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, NotifyOnSourceUpdated=True}" > 
2

Le RadioButton lie à la propriété ListBoxItem IsSelected, pas votre propriété SchoolInfo IsSelected.

(Il est déroutant car ListBoxItem a une propriété "IsSelected", et donc aussi votre objet SchoolInfo, ce qui explique pourquoi il n'y avait pas d'erreur de liaison). Pour corriger, ListBoxItem.IsSelected doit être lié à votre propriété SchoolInfo IsSelected. Par exemple, vous avez besoin d'un accesseur supplémentaire pour que ListBoxItem se connecte à SchoolInfo.IsSelected, puis l'élément de zone de liste fonctionnera comme il se doit et le composant RadioButton peut se lier correctement à ListBoxItem.IsSelected.

<Style TargetType="{x:Type ListBoxItem}" > 
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />