2011-07-12 65 views
2

下面的代碼有第二個組合框的性能問題......當我改變第一個combox然後打開第二個combox時它是好的。但是,如果我改變了第二次的第一COMBOX並嘗試打開它有很多性能問題的 第二COMBOX箱....WPF嵌套列表性能問題

公共部分類主窗口:窗口, 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

我懷疑它與每次第一個盒子更改時重新綁定第二枚枚舉有關。

取而代之,綁定第二個盒子一次;

 <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 box項目1中的更改​​而變化...例如,ABC的動作類型爲 – charvind

+0

ok,現在請看 - 您正在使用枚舉作爲標誌 - 所以不是集合,而是使用(標記)枚舉設置一個值值 - bookTypes = A + B + D;並用複選框或其他東西顯示它。爲什麼你會以這種方式使用組合框?順便說一句 - 我的答案處理你的表現問題,沒有解決你的邏輯方法。 – Spiked3

+0

我在說的是BookType取決於書。所以有些書不能有可用的書類行爲。所以當我改變這本書時,我需要改變Booktype選項。 – charvind