【问题标题】:WPF Nested List performance ProblemsWPF 嵌套列表性能问题
【发布时间】:2011-07-12 18:17:04
【问题描述】:

下面的代码与第二个组合框存在性能问题...当我更改第一个组合框然后打开第二个组合框时它很好。但是,如果我第二次更改第一个组合框并尝试打开 第二个组合框有很多性能问题....

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

【问题讨论】:

  • +1 表示有一些很好的示例代码的问题,但是您的示例代码在我的机器上运行良好,完全没有任何性能问题。
  • 运行应用程序,将组合框 1 项更改为 xyz.open 组合框 2。现在再次将组合框 1 更改为 Abc 并尝试打开组合框 2 ...注意在下拉菜单打开
  • 它对我来说很好用。也许我们的环境有些不同?我正在使用 VS2010 Ultimate、.Net Framework 4.0 和 Windows XP SP3。
  • 是实际代码还是您删除了不必要的代码,这可能是访问任何资源(如网络、数据库或任何文件)等真正的问题?
  • 我检查了代码,你做的例子没有性能问题。那只能意味着您没有对自己的代码进行正确的抽象。我同意 Akash 的观点,即数据检索可能是罪魁祸首,而您在示例中绕过了这一点。

标签: wpf


【解决方案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" />

【讨论】:

  • 但是combox2项目随着combox项目1的变化而变化......例如ABC有动作类型
  • 好的,现在看到 - 您正在使用枚举作为标志 - 所以不是集合,而是使用(标记的)枚举值设置一个值 - bookTypes= A+B+D;并用复选框或其他东西显示它。为什么要以这种方式使用组合框?顺便说一句 - 我的回答处理了你的性能问题,没有解决你的逻辑方法。
  • 我所说的是 BookType 取决于书。所以有些书不能有可用的 booktype 操作。所以当我改变这本书时,我需要改变 Booktype 选项。
  • 对于这样一个小例子,我不会不同意存在性能问题,这不应该是您使用它的方式。但我怀疑它不在您的代码中,而是在 WPF 中。我怀疑这个用例是否在设计和测试中得到了很大的重视。如果枚举标志方法在现实生活中成为问题,它仍然有效。正如@rachel 指出的那样,在我的机器上几乎无法检测到它。
  • 这不是实际的业务场景......为了简单起见,我修改了代码以预订 dbooktypes。我正在使用 Windows 7 和 vs 终极版。在我的机器上需要 2 秒才能打开下拉菜单。我应该在微软论坛上发布它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多