2012-10-16 3 views
0

J'ai une liste déroulante modifiable par l'utilisateur, donc j'ai lié la propriété Text à une propriété de ma classe. La ItemsSource de cette même liste déroulante est liée à un AsyncObservableCollection (ce que j'ai fait en fonction d'autres publications et cela fonctionne bien).Problème lors de la mise à jour d'ItemsSource

Cependant, j'ai un problème lors de la mise à jour de ItemsSource.

est ici les étapes pour reproduire:

  1. Sélectionnez une valeur dans la zone de liste déroulante déroulant.
  2. Tapez du texte dans la liste déroulante. (dites "aaa")
  3. Mettez à jour la source Items. (via mon clic de bouton)

Résultat: La propriété MyText reste définie sur le texte que vous avez saisi ("aaa"), mais la zone de liste déroulante affiche une entrée vide. Toutefois, si vous suivez les mêmes étapes que ci-dessus mais ignorez l'étape 1, la liste déroulante affiche correctement le texte de la propriété MyText. Cela m'amène à croire que l'index sélectionné/la valeur sélectionnée est utilisée pour mettre à jour la liste déroulante après la mise à jour de ItemsSource.

Des idées sur la façon dont je peux synchroniser la valeur affichée avec la propriété MyText après une mise à jour de ItemsSource?

Dans le code fourni ci-dessous, je suis en train de mettre à jour le ItemsSource sur le bouton click afin de le reproduire.

Merci!

XAML:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
<Grid> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="200" IsEditable="True" 
          DataContext="{Binding Path=MyDataClass}" 
          ItemsSource="{Binding Path=MyListOptions}" 
          SelectedIndex="{Binding Path=MySelectedIndex}" 
          Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus}" 
       > 
    </ComboBox> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="416,276,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
</Grid> 

code derrière:

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Windows; 
using System.Diagnostics; 

namespace WpfApplication2 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public class DataClass : INotifyPropertyChanged 
     { 
      private string mytext = ""; 
      public string MyText 
      { 
       get 
       { 
        return mytext; 
       } 
       set 
       { 
        mytext = value; 
        OnPropertyChanged("MyText"); 
       } 
      } 

      private int myselectedindex = -1; 
      public int MySelectedIndex 
      { 
       get 
       { 
        return myselectedindex; 
       } 

       set 
       { 
        if (value != -1) 
        { 
         mytext = MyListOptions[value]; 
         OnPropertyChanged("MyText"); 
        } 
       } 
      } 

      private AsyncObservableCollection<string> mylistOptions = new AsyncObservableCollection<string>(); 
      public AsyncObservableCollection<string> MyListOptions 
      { 
       get 
       { 
        return mylistOptions; 
       } 

       set 
       { 
        mylistOptions.Clear(); 
        OnPropertyChanged("MyListOptions"); 
        foreach (string opt in value) 
        { 
         mylistOptions.Add(opt); 
        } 
        OnPropertyChanged("MyListOptions"); 
       } 
      } 

      public DataClass() 
      { 
      } 

      public event PropertyChangedEventHandler PropertyChanged; 

      internal void OnPropertyChanged(string prop) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
      } 
     } 

     public DataClass MyDataClass { get; set; } 

     public MainWindow() 
     { 
      MyDataClass = new DataClass(); 

      MyDataClass.MyListOptions.Add("Option 1 - Provides helpful stuff."); 
      MyDataClass.MyListOptions.Add("Option 2 - Provides more helpful stuff."); 
      MyDataClass.MyListOptions.Add("Option 3 - Provides extra helpful stuff."); 

      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      AsyncObservableCollection<string> newList = new AsyncObservableCollection<string>(); 
      newList.Add("Option A - Provides helpful stuff."); 
      newList.Add("Option B - Provides more helpful stuff."); 
      newList.Add("Option C - Provides extra helpful stuff."); 

      MyDataClass.MyListOptions = newList; 

     } 
    } 
} 

Répondre

0

Ok, je l'ai résolu ce problème en liant le SelectedValue à la même propriété que le texte et la mise en son mode à OneWay.

<ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="200" IsEditable="True" 
          DataContext="{Binding Path=MyDataClass}" 
          ItemsSource="{Binding Path=MyListOptions}" 
          SelectedIndex="{Binding Path=MySelectedIndex}" 
          SelectedValue="{Binding Path=MyText, Mode=OneWay}" 
          Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus}" 
Questions connexes