2010-01-22 19 views
0
<CombobBox x:Name="cbo" 
      Style="{StaticResource ComboStyle1}" 
      DisplayMemberPath="NAME" 
      SelectedItem="{Binding Path=NAME}" 
      SelectedIndex="1"> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
     <TextBlock Text="{Binding Path=NAME}"/> 
     </Grid> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Dans le Window événement OnLoaded, j'ai écrit le code pour définir le ItemsSource:Pourquoi ce WPF ComboBox n'affiche-t-il pas la valeur sélectionnée?

cbo.ItemsSource = ser.GetCity().DefaultView; 

Lors du chargement de la fenêtre, je peux voir que le départ du premier élément chargement, mais en même temps, il efface l'élément affiché. Je suis coincé dans ce scénario et toute aide est appréciée.

Cordialement

Kishore

Répondre

4

réponse rapide: Définir SelectedIndex = 1 de code-behind.

Il semble que le code en XAML s'exécute en premier (la méthode InitializeComponent()), qui définit SelectedIndex = 1, mais ItemsSource n'est pas encore spécifié! Donc SelectedIndex n'affectera pas! (Et rappelez-vous, vous ne pouvez pas spécifier ItemsSourceavantInitializeComponent())

donc vous devez régler manuellement SelectedIndex = 1 après avoir réglé ItemsSource.


Vous devriez faire comme ceci:

XAML

  <ComboBox x:Name="cbo" 
         Style="{StaticResource ComboStyle1}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <TextBlock Text="{Binding Path=NAME}"/> 
         </Grid> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 

code

 cbo.ItemsSource = ser.GetCity().DefaultView; 
    cbo.SelectedIndex = 1; 

Ou ceci:

XAML

  <ComboBox x:Name="cbo" Initialized="cbo_Initialized" 
         Style="{StaticResource ComboStyle1}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <TextBlock Text="{Binding Path=NAME}"/> 
         </Grid> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 

code

private void cbo_Initialized(object sender, EventArgs e) 
    { 
     cbo.SelectedIndex = 1; 
    } 

Notez également que je l'ai enlevé DisplayMemberPath="NAME" parce que vous ne pouvez pas définir à la fois DisplayMemberPath et ItemTemplate en même temps. Et aussi, utilisez soit SelectedItem ou SelectedIndex, pas les deux.

+1

Merci beaucoup pour vos commentaires. –

2

Remise à zéro du ItemsSource gâchera la sélection.

En outre, vous définissez à la fois SelectedItem et SelectedIndex. Vous voulez en définir un seul; Si vous définissez les deux, un seul prendra effet.

En outre, votre déclaration SelectedItem est probablement erronée. SelectedItem="{Binding NAME}" recherchera un élément qui est égal à la valeur de la propriété NAME du DataContext ambiant (probablement Window). Cela ne fonctionnera que si ComboBox.ItemsSource est une liste de chaînes. Puisque votre ItemTemplate fonctionne, je suppose que ComboBox.ItemsSource est en fait une liste d'objets City. Mais vous dites à WPF que SelectedItem doit être une chaîne (un nom). Cette chaîne ne sera jamais égale à aucun objet City, donc le résultat ne sera pas une sélection.

Donc, pour résoudre le problème, après avoir réglé ItemsSource, soit mis SelectedItem ou SelectedIndex, selon vos besoins et votre modèle de données:

cbo.ItemsSource = ser.GetCity().DefaultView; 
cbo.SelectedIndex = 1; 
// or: cbo.SelectedItem = "Wellington"; // if GetCity() returns strings - probably not 
// or: cbo.SelectedItem = City.Wellington; // if GetCity() returns City objects 
+0

+1 Pour réinitialiser ItemsSource va gâcher la sélection. Je rafraîchissais ma ItemsSource qui a gâché la liaison. –