私はCaliburn Micro & Fluent Ribbonを.NET 4.0ベースのWPFアプリケーションで使用しています。私の問題は、ビュー間の変更が遅すぎるということです。私はこの問題の根本を知っていると思います。ビュー間の切り替えが遅い(ビューには多くのアイテムが含まれているDataGridが含まれています)
しかし、私は解決する方法はありません。まず、私のアプリのデザインについて説明します。
シェルはWPFウィンドウで、Fluent Ribbon.MenuにはRibbonTabItemアイテムが含まれています。ユーザーがシェルのタブ項目をクリックすると、新しいビューが読み込まれます。ここで
は、ビューのXAMLです:
<StackPanel Grid.Row="0">
<Fluent:Ribbon>
<Fluent:Ribbon.Menu>
<Fluent:Backstage>
<Fluent:BackstageTabControl>
<Fluent:BackstageTabItem Header="Open"/>
<Fluent:BackstageTabItem Header="Close"/>
</Fluent:BackstageTabControl>
</Fluent:Backstage>
</Fluent:Ribbon.Menu>
<!--Tabs-->
<Fluent:RibbonTabItem Micro:Message.Attach="[PreviewMouseLeftButtonDown]=[Action ShowView1()]"/>
<Fluent:RibbonTabItem Micro:Message.Attach="[PreviewMouseLeftButtonDown]=[Action ShowView2()]"/>
<Fluent:RibbonTabItem Micro:Message.Attach="[PreviewMouseLeftButtonDown]=[Action ShowViewN()]"/>
</Fluent:Ribbon>
</StackPanel>
<Grid Grid.Row="1">
<ContentControl x:Name="ActiveItem" />
</Grid>
</Grid>
ShellViewモデルクラス:
namespace T_TOOL.ViewModels
{
public interface IShellViewModel{}
[Export(typeof(IShellViewModel))]
public class ShellViewModel :Conductor<IScreen>.Collection.OneActive,
IShellViewModel,
IPartImportsSatisfiedNotification
{
public void ShowView1()
{
var screen = IoC.Get<IShowView1();
ActivateItem(screen);
}
public void ShowView2()
{
var screen = IoC.Get<IShowView2();
ActivateItem(screen);
}
//...
public void ShowViewN()
{
var screen = IoC.Get<IShowViewN();
ActivateItem(screen);
}
}
}
ViewModel1、ViewModel2、... ViewModelNは唯一のDataGridコントロールが含まれています。 Datagridコントロールでは、ICollectionViewのプロパティタイプをビューモデルからバインドします。
このプロパティには18,000 - 25,000件のアイテムが含まれています。私はこれが問題の根源だと思うのですが、なぜViews間の変更が遅いのですか?私は拡張WPFツールキットからDataGridコントロールを使用します。
DataGridのEnableRowVirtualizationプロパティとEnableColumnVirtualizationプロパティをtrueに設定しました。しかし、それは助けにはならない。 ViewModel1クラスから
<Style x:Key="MainView_CallsDataGrid" TargetType="{x:Type Controls:DataGrid}"
BasedOn="{StaticResource MainView_FontBaseStyle}">
<Setter Property="AutoGenerateColumns" Value="False"/>
<Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
<Setter Property="HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="Margin" Value="4,15,4,15"/>
<Setter Property="EnableRowVirtualization" Value="True"/>
<Setter Property= "EnableColumnVirtualization" Value="True"/>
</Style>
コード:ここで
はViewModel1のビューXAMLコードである public ICollectionView CallsView
{
get
{
return _callsView;
}
set
{
_callsView = value;
NotifyOfPropertyChange(() => CallsView);
}
}
//... Init CallsView property from List<T> property
CallsView = CollectionViewSource.GetDefaultView(List<T>);
FilterCalls();
CallsView.Refresh();
//Filter method
private void FilterCalls()
{
if (CallsView != null)
{
CallsView.Filter = new Predicate<object>(FilterOut);
CallsView.Refresh();
}
}
私の意見が正しいのですか? datagridには多くの行が含まれているため、ビュー間の切り替えは遅いですか?または問題は、ICollectionViewのDataGridコントロールプロパティタイプでバインドすることですか?
ご意見、ご提案、ご意見ありがとうございます。
ここはscreen shotです。
Screen Shot http://i51.tinypic.com/2mzyzh4.jpg
スクリーンショットへのリンクは動作しません。 – VoodooChild
2番目のC#コード貼り付けでCallsView.Refresh()を2回実行していますか?実際に、リフレッシュコールをまったく行う必要がありますか? notifypropertychangedを実装すると、データの変更によってUIに通知が送信され、リフレッシュする必要があることがわかりました。 – evasilchenko