2011-07-12 11 views
2

次のコードは、2番目のコンボボックスでパフォーマンスの問題があります。最初のコンボボックスを変更して2番目のコンボボックスを開いたときに、それが正常です。私は....WPFネストされたリストのパフォーマンスの問題

公共部分クラスのメインウィンドウ二度目の最初COMBOXを変更し、それがパフォーマンスの問題の多くを持っている 二COMBOXボックスを開くしようとした場合でも:ウィンドウを、 はINotifyPropertyChangedの {

public MainWindow() 
    { 
     InitializeComponent(); 

     Books = new List<Book>(); 
     Books.Add(new Book("Abc")); 
     Books.Add(new Book("Cde")); 
     Books.Add(new Book("Xyz")); 
     Books.Add(new Book("Min")); 
     this.DataContext = this; 
     SelectedBook = Books[0]; 
    } 

    Book _selctedBook; 
    public Book SelectedBook 
    { 
     get { return _selctedBook; } 
     set 
     { 
      _selctedBook = value; 
      raiseChange("SelectedBook"); 
     } 
    } 

    List<Book> _books = new List<Book>(); 
    public List<Book> Books { get { return _books; } set { _books = value; raiseChange("Books"); } } 

    void raiseChange(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

} 

public class Book : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public ObservableCollection<BookType> BookTypes { get; set; } 

    BookType _selectedBookType; 
    public BookType SelectedBookType { get { return _selectedBookType; } set { _selectedBookType = value; raiseChange("SelectedBookType"); } } 

    public Book(string name) 
    { 
     Name = name; 
     BookTypes = new ObservableCollection<BookType>(); 


     if (name == "Abc") 
      BookTypes.Add(BookType.Action); 

     BookTypes.Add(BookType.Comedy); 
     BookTypes.Add(BookType.Drama); 
     BookTypes.Add(BookType.Friction); 
     BookTypes.Add(BookType.Thriller); 

     SelectedBookType = BookTypes[0]; 
    } 


     void raiseChange(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public enum BookType 
{ 
    Friction, 
    Drama, 
    Action, 
    Thriller, 
    Comedy, 
} 

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="ItemTemplate2"> 
      <StackPanel> 
       <TextBlock Text="{Binding .}"/> 
      </StackPanel> 
     </DataTemplate> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
     <ComboBox Height="23" Name="comboBox1" Grid.Row="0" 
       SelectedItem="{Binding SelectedBook,Mode=TwoWay}" 
       ItemsSource="{Binding Books}" 
       DisplayMemberPath="Name" 
       Width="386" /> 
    <ComboBox Height="23" Name="comboBox2" Grid.Row="1" DataContext="{Binding SelectedItem, ElementName=comboBox1}" 
       ItemsSource="{Binding BookTypes}" SelectedItem="{Binding SelectedBookType,Mode=TwoWay}" 
       Width="386" ItemTemplate="{DynamicResource ItemTemplate2}"> 

    </ComboBox> 

</Grid> 
+0

+1良い質問例のコードでは、私のマシン上でパフォーマンスの問題が全くなくてもうまく動作します。 – Rachel

+0

アプリケーションを実行し、combox 1の項目をxyz.open combox box 2に変更します。今度はcombox 1をもう一度変更してAbcと言い、combox 2を開こうとします。ドロップダウンが開く前に大きな遅れがあることを確認してください。 – charvind

+0

私のために。おそらく、私たちの環境には何か違うことがありますか?私はVS2010 Ultimate、.Net Framework 4.0、およびWindows XP SP3を使用しています。 – Rachel

答えて

0

最初のボックスが変更されるたびに、2番目の列挙を再バインドする必要があると思われます。

代わりに、2番目のボックスを1回バインドします。

 <Grid.Resources> 
      <DataTemplate x:Key="ItemTemplate2"> 
       <StackPanel> 
        <TextBlock Text="{Binding .}"/> 
       </StackPanel> 
      </DataTemplate> 

      <ObjectDataProvider x:Key="BookTypeEnum" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> 
       <ObjectDataProvider.MethodParameters> 
        <x:Type TypeName="local:BookType"/> 
       </ObjectDataProvider.MethodParameters> 
      </ObjectDataProvider> 

     </Grid.Resources> 


    <ComboBox Height="23" Name="comboBox2" Grid.Row="1" DataContext="{Binding SelectedItem, ElementName=comboBox1}" 
      ItemsSource="{Binding Source={StaticResource BookTypeEnum}}" SelectedItem="{Binding SelectedBookType,Mode=TwoWay}" 
      Width="386" /> 
+0

combox2の項目は、comboxボックスの項目1の変更に伴い変化します。たとえば、ABCのアクションタイプは – charvind

+0

です。これを見ると、enumをフラグとして使用しています。そのため、コレクションの代わりに(フラグ付き)enum値 - bookTypes = A + B + D;チェックボックスなどで表示します。なぜあなたはこの方法でコンボボックスを使用しますか? BTW - 私の答えはあなたのパフォーマンスの問題を処理し、あなたの論理的なアプローチを解決しませんでした。 – Spiked3

+0

私が言っていることはBookTypeが本に依存しているということです。したがって、一部の書籍ではbooktypeアクションを利用できません。だから私は本を変更するときにブックタイプのオプションを変更する必要があります。 – charvind

関連する問題