gpt4 book ai didi

c# - 提高 WPF 中的绑定(bind)性能?

转载 作者:太空宇宙 更新时间:2023-11-03 17:59:45 24 4
gpt4 key购买 nike

我意识到这个问题可以归结为“为什么我的代码这么慢?”但我希望能从中得到更多。让我解释一下我的代码。

我有一个实现 INotifyPropertyChanged 的​​类以进行绑定(bind),该类看起来与此类似:

  public class Employee : INotifyPropertyChanged 
{
string m_strName = "";
string m_strPicturePath = "";
public event PropertyChangedEventHandler PropertyChanged;

public string Picture
{
get { return this.m_strPicturePath; }
set { this.m_strPicturePath = value;
NotifyPropertyChanged("Picture"); }
}

public string Name
{
get { return this.m_strName; }
set { this.m_strName = value;
NotifyPropertyChanged("Name");
}
}

private void NotifyPropertyChanged(String pPropName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(pPropName));
}
}
}

在我的 XAML 中,我创建了一个绑定(bind)到该对象的 DataTemplate:

 <DataTemplate x:Key="EmployeeTemplate">
<Border Height="45" CornerRadius="0" BorderBrush="Gray" BorderThickness="0" Background="Transparent" x:Name="bordItem">
<Grid Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Name}" VerticalAlignment="Center" Padding="10" HorizontalAlignment="Stretch" FontWeight="Bold" FontSize="20"/>
<Image Grid.Column="1" Source="{Binding Path=Picture}"></Image>
</Grid>
</Border>
</DataTemplate>

然后把这个模板放在一个列表框上:

<ListBox x:Name="lstEmployees" ItemTemplate="{DynamicResource EmployeeTemplate}" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True"></ListBox>

所以在代码中它被设置为:

lstEmployees.ItemsSource = this.m_Employees;

“m_Employees”列表在应用程序启动时从数据库中得到水合,然后在那之后我设置了上面的代码行。 ListBox 在 TabControl 上。

现在,我的实际问题是:我的“m_Employees”列表从数据库中返回了大约 500 多名员工,所以这个集合有点大。当应用程序首次启动并且有人导航到带有 ListBox 的选项卡时,我在 WPF 中遇到了性能问题。 UI 会卡住大约 3 秒,但只有在应用首次启动时才会出现 - 之后就没问题了。

这可能是因为:

  • 代码必须打到硬盘上才能找到每个员工的图像?
  • 我做的虚拟化不正确?
  • 编辑
  • WPF 仅在有人导航到该 TabControl 时才使用我的 DataTemplate 进行一次呈现,并且突然尝试绘制 500 多个员工项目?如果是这样,是否有任何方法可以在 WPF 中“预加载”ListView?

如有任何其他改进上述内容的建议,我们将不胜感激。感谢您阅读并提前提出任何建议。

-R.

最佳答案

  1. 用公众号包装 m_Employees属性(property)(员工)
  2. 不是像您那样在代码中设置 ItemsSource,而是使用 Binding 设置它并将 IsAsync 设置为没错。

ItemsSource="{Binding Empolyess, IsAsync=True}"

您也可以在代码中分配绑定(bind)。

希望这对您有所帮助。

关于c# - 提高 WPF 中的绑定(bind)性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com