我正在使用MVVM模式來顯示事務的樹數據。WPF MVVM treeview性能
該層次是客戶 - >帳戶 - >交易。
我有一個基類TreeItemViewModel,它實現了像IsExpanded,IsSelected等兩種依賴屬性的基本依賴屬性。然後我有一堆類,如CustomerViewModel,AccountViewModel,TransactionViewModel。每一個都有一個兒童系列。所以一個CustomerViewModel將包含一個AccountViewModel的列表,每個AccountViewModel都有它自己的Children集合的TransactionViewModel。然後我使用數據模板將XAML綁定到這些視圖模型上,下面給出了一個示例(transactionviewmodel模板)。
當您展開節點時,會調用基類的IsExpanded方法,然後加載節點的子節點 - 因此它是延遲加載。此外,當您展開客戶節點時,它不僅會加載帳戶,還會加載每個帳戶的交易,因爲它們是少數統計數據所需的。因此,當您展開帳戶節點時,只需根據數據結構綁定呈現transactionview模型,因爲實際的子模型(transactionview模型對象)已由該點加載。
它的這種交易非常緩慢,特別是對於大量交易。
我已經測試了一個客戶,一個擁有6000個交易的賬戶並註釋掉了大部分的數據模板。而定時爲如下只包括
非image列 - 26S 所有列,改變圖像轉換器類爲null返回,而不是圖像 - 51S 所有列,包括圖片:20分鐘
所以,我的擔心是
1)首先加載6000個事務的27個似乎非常緩慢,這是沒有任何圖像涉及。我的設計是否會放慢速度,如何在不重新構建整個事物的情況下更好地完成這項工作? (此時不是選項)
2)如何加快圖像處理速度,以免掛起應用程序?下面
確定代碼的交易數據模板
<Grid.RowDefinitions>
<RowDefinition Height="18" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding TransactionId}" />
<TextBlock Grid.Column="1" Text="{Binding CutOffDate}" />
<Image Grid.Column="2" Source="{Binding AlarmImg, Converter={StaticResource stringToImageConverter}}" Height="25" HorizontalAlignment="Left"/>
<TextBlock Grid.Column="3" Text="{Binding SourceSystemDesc}" />
<Image Grid.Column="4" Margin="0,0,0,0" Source="{Binding CcmpImg, Converter={StaticResource stringToImageConverter}}" Height="25" ToolTip="CCMP Type" HorizontalAlignment="Left"/>
<Image Grid.Column="5" Margin="0,0,0,0" Source="{Binding PrintedImg, Converter={StaticResource stringToImageConverter}}" Height="25" ToolTip="Printed" HorizontalAlignment="Left"/>
<Image Grid.Column="6" Margin="0,0,0,0" Source="{Binding AppRejImg, Converter={StaticResource stringToImageConverter}}" Height="25" ToolTip="Approved/Rejected" HorizontalAlignment="Left"/>
<Image Grid.Column="7" Margin="0,0,0,0" Source="{Binding LockImg, Converter={StaticResource stringToImageConverter}}" Height="25" ToolTip="Locked" HorizontalAlignment="Left"/>
<TextBlock Grid.Column="8" Style="{StaticResource myTxnStyleColor}" Text="{Binding TxnAmount}" HorizontalAlignment="Right"/>
<TextBlock Grid.Column="9" Text="{Binding TxnCurrency}" HorizontalAlignment="Right" />
<Image Grid.Column="10" Margin="0,0,0,0" Source="{Binding CurrencyImg, Converter={StaticResource stringToImageConverter}}" Height="25"/>
</Grid>
</DataTemplate>
最後frigged靜態資源轉換器返回空白圖像
using System;
using System.Globalization;
using System.Runtime.Caching;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Citi.Rbcs.UI.Windows.HelperClasses
{
public class StringToImageConverter : IValueConverter
{
private static readonly BitmapImage BlankImage =
new BitmapImage(new Uri("pack://application:,,,/Resources/Images/Blank.gif"));
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
return BlankImage;
var imageUrl = value as string;
if (string.IsNullOrEmpty(imageUrl)) return BlankImage;
// Strip out the Image name so we ignore path
if (imageUrl.LastIndexOf(@"\") != -1)
imageUrl = imageUrl.Substring(imageUrl.LastIndexOf(@"\") + 1);
if (imageUrl.LastIndexOf(@"/") != -1)
imageUrl = imageUrl.Substring(imageUrl.LastIndexOf(@"/") + 1);
var image = MemoryCache.Default.Get(imageUrl) as ImageSource;
if (image == null)
{
image = new BitmapImage(new Uri("pack://application:,,,/Resources/Images/" + imageUrl));
MemoryCache.Default.Set(imageUrl, image, new CacheItemPolicy());
}
return image;
}
catch (Exception)
{
return BlankImage;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
任何幫助將不勝感激,理想我想這個hierachichal數據的WPF樹視圖,你可以擴大與一個節點希望大約5-10秒內有6000名兒童。什麼導致它需要這麼長時間,它只是MVVM數據綁定?
對不起,但我擔心,沒有人會閱讀整篇文章。請把它減少到必要的部分。 – DHN