【问题标题】:Performance issue - DataTemplate and DataBinding - 1st load性能问题 - DataTemplate 和 DataBinding - 第一次加载
【发布时间】:2015-07-23 22:53:24
【问题描述】:

这是我的用户界面图:

我在顶部有一个元素列表(clickme1 和 clickme2)。这个元素中的每一个都会在 MyList 中包含一些我想在列表框的 customElement 中显示的信息。

默认情况下单击 Clickme1。当我单击 Clickme2 时,列表框需要 2-3 秒才能通过 Clickme2 的信息更新 CustomElements。当我再次切换时,它会立即更新,因此问题仅在第一次单击时可见。 CustomElement 对 Clickme 元素(图像和文本)有很多不同的绑定。

这是我的代码:

public ObservableCollection<CustomClass> MyList { get; set; }


<ListBox x:Name="MyListBox"
    ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" 
    ItemsSource="{Binding MyList}">
        <ListBox.ItemTemplate>
                <DataTemplate>
                        <local:CustomElement x:Name="MyCustomElement"/>
                </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="OverridesDefaultStyle" Value="true" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <Border x:Name="Border" BorderBrush="Transparent" Background="Black">
                                    <ContentPresenter />
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
</ListBox>

我尝试使用 VirtualizingStackPanel 而不是 WrapPanel,但没有任何改进。

有什么帮助吗?

【问题讨论】:

    标签: wpf performance data-binding datatemplate


    【解决方案1】:

    当您重新填充集合时,您是否分配了一个新的 ObservableCollection?还是在现有的基础上工作?

    您应该“离线”填充您的集合,然后绑定它。或 Google 获取支持“批量插入”的 ObservableCollection 衍生产品。标准的 ObservableCollection 将为每个插入发送一个 UI 更新。

    错误:

    MyList.Clear();
    MyList.Add(...);
    

    右:

    ObservableCollection<CustomClass> coll = new ...
    coll.Add(...);
    MyList = coll;
    

    【讨论】:

    • 更新完成后我不会重新填充集合。我将我的整个事情绑定到“currentClickme”。因此,当我单击 Clickme2 时,我正在调用执行“currentClickme = Clickme2”的命令。 Clickme1 和 Clickme2 都有一个 MyList 实例。
    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多