2013-01-23 104 views
0

我正在使用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數據綁定?

+2

對不起,但我擔心,沒有人會閱讀整篇文章。請把它減少到必要的部分。 – DHN

回答

0

我假設你沒有同時顯示來自XAML的所有圖像。

有兩個可能的原因是緩慢:

1 - 重XAML解析和負載是非常非常慢

2 - 綁定是偉大的,但連續的,有約束力的鎖和其他綁定等。

你可以試試:

1 - 不要在德興時間innecesary控件添加到您的XAML,添加它在運行時創建控件dinamically,更快(或最快)。即使這些都沒有顯示,請記住問題在於解析和加載。

2 - 儘可能使用異步綁定。這樣綁定就不會互相鎖定。