2012-10-16 107 views
0

我有一个可由用户编辑的组合框,所以我将Text属性绑定到我的类的属性。该同一个组合框的ItemsSource绑定到一个AsyncObservableCollection(我基于其他帖子,它很好地工作)。更新项目时出现问题源

但是,更新ItemsSource时出现问题。

下面是步骤来重现:

  1. 选择在组合框中的值降下来了。
  2. 在组合框中键入一些文本。 (比如“aaa”)
  3. 更新ItemsSource。 (通过我的按钮单击)

结果:MyText属性仍然设置为您在(“aaa”)中键入的文本,但组合框显示空白条目。

但是,如果您执行上述相同步骤但跳过步骤1,则组合框将正确显示MyText属性中的文本。这导致我相信在更新ItemsSource完成后,选定的索引/选定值正用于更新组合框。

关于如何在更新ItemsSource后保持显示值与MyText属性同步的任何想法?

在下面提供的代码中,我正在更新按钮上的ItemsSource,以便重现。

谢谢!

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> 

后面的代码:

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; 

     } 
    } 
} 

回答

0

好吧,我用的SelectedValue绑定到相同的属性为文本并设置其模式为单向解决了这个问题。

<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}"