2016-11-29 21 views
1

PRISM 6のWPFアプリケーションでDevExpressのDocumentGroupとDocumentGroupAdapter(自分のサイトのE3339で説明)を使用しています。新しいドキュメントにナビゲートすることができ、美しいINavigationAwareインターフェイスが自分のビューモデルで正しく動作していることがわかります。唯一の問題は、実際のドキュメント(タブコントロールのタブのような)が2回目にナビゲートされたとき(ビューのINavigationAwareが期待どおりに機能する)、アクティブ化されないこと(タブが表示されることを意味する)です。PRISMでナビゲートするときにドキュメントグループ領域でDevExpress DocumentPanelを有効にする

+0

INavigationAwareにはOnNavigatedToイベントがあります。それを使ってみましたか?それがうまくいくような気がする。 –

+0

はい、このイベントは、地域にないビューモデルで発生します。私はすべての私のドキュメントビューモデルタイプを変更することなく、イベントにフックできるようにしたいと思います。 – Aktaeon

+0

を追加して、タブでホストされているビューモデルのビューではなく、ビューを更新する "タブ"コントロールの責任であるため、この問題を解決する必要があります。 – Aktaeon

答えて

0

私はDevExrpessコントロールに慣れていませんが、Infragistics xamDockManagerコントロールのカスタムリージョンアダプタとIActiveAwareビヘイビアを持っています。コードをチェックし、コントロールベンダーと連携するようにコードを変更できるかどうかを確認してください。

https://github.com/brianlagunas/xamDockManager-Region-Adapter

+0

ブライアンに感謝します。私は 'トリック'がRegion.Deactivateメソッドにあると思います。これは、実際には領域からビューをアンロードするか、それとも単にビューをアクティブなものとしてマークするのではなく、メモリおよび領域内に保持するだけですか? – Aktaeon

+0

さらにそれを見ると、ドキュメントグループアダプタがAllActiveRegionとして実装されていることが問題の1つと考えられます。明日はさらにチェックします。うまくいけば正しい方向に私を指摘してくれてありがとう;-) – Aktaeon

+0

ありがとうブライアン!あなたのコードに基づいて動作しています。 – Aktaeon

1

は、私はそれがブライアンの回答に基づいて作業しました。ここに興味のある人は私のソリューションです。ビューを使用して私のビューモデルにIPanelInfoを実装します。その結果、すでに開いているドキュメントパネルに再度ナビゲートすると、アクティブ化される前にアクティブ化されます。現在はテストが不十分です。

public class DocumentGroupAdapter : RegionAdapterBase<DocumentGroup> 
{ 
    public DocumentGroupAdapter(IRegionBehaviorFactory behaviorFactory) : 
     base(behaviorFactory) 
    { 
    } 

    protected override IRegion CreateRegion() 
    { 
     return new SingleActiveRegion(); 
    } 
    protected override void Adapt(IRegion region, DocumentGroup regionTarget) 
    { 
     region.Views.CollectionChanged += (s, e) => { 
      OnViewsCollectionChanged(regionTarget, e); 
     }; 
     var manager = regionTarget.GetDockLayoutManager(); 
     manager.DockItemClosing += (s, e) => 
     { 
      Closing(region, e); 
     }; 
     manager.ClosingBehavior = ClosingBehavior.ImmediatelyRemove; 
    } 

    protected override void AttachBehaviors(IRegion region, DocumentGroup regionTarget) 
    { 
     base.AttachBehaviors(region, regionTarget); 

     if (!region.Behaviors.ContainsKey(DocumentGroupSyncBehavior.BehaviorKey)) 
      region.Behaviors.Add(DocumentGroupSyncBehavior.BehaviorKey, new DocumentGroupSyncBehavior() { HostControl = regionTarget }); 
    } 


    private static void Closing(IRegion region, ItemEventArgs e) 
    { 
     var documentPanel = e.Item as DocumentPanel; 
     var view = documentPanel?.Content; 
     if (view == null) return; 
     var v = view as FrameworkElement; 
     var info = v?.DataContext as IPanelInfo; 
     info?.Close(); 
     region.Remove(view); 
    } 

    private static void OnViewsCollectionChanged(DocumentGroup regionTarget, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
      foreach (var view in e.NewItems) 
      { 
       var manager = regionTarget.GetDockLayoutManager(); 
       var panel = manager.DockController.AddDocumentPanel(regionTarget); 
       panel.Content = view; 
       panel.ClosingBehavior = ClosingBehavior.ImmediatelyRemove; 
       var v = view as FrameworkElement; 
       var info = v?.DataContext as IPanelInfo; 
       if (info != null) 
       { 
        var myBinding = new Binding 
        { 
         Source = v.DataContext, 
         Path = new PropertyPath("Caption"), 
         Mode = BindingMode.TwoWay, 
         UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
        }; 
        BindingOperations.SetBinding(panel, BaseLayoutItem.CaptionProperty, myBinding); 
       } 
       manager.DockController.Activate(panel); 
      } 
    } 
} 

public class DocumentGroupSyncBehavior : RegionBehavior, IHostAwareRegionBehavior 
{ 
    public const string BehaviorKey = "DocumentGroupRegionActiveAwareBehavior"; 

    private DocumentGroup _hostControl; 
    public DependencyObject HostControl 
    { 
     get { return _hostControl; } 
     set { _hostControl = value as DocumentGroup; } 
    } 

    protected override void OnAttach() 
    { 
     _hostControl.SelectedItemChanged += HostControl_SelectedItemChanged; 
     Region.ActiveViews.CollectionChanged += ActiveViews_CollectionChanged; 
    } 

    private void HostControl_SelectedItemChanged(object sender, SelectedItemChangedEventArgs e) 
    { 
     if (e.OldItem != null) 
     { 
      var item = e.OldItem; 
      //are we dealing with a DocumentPanel directly 
      if (Region.Views.Contains(item) && Region.ActiveViews.Contains(item)) 
      { 
       Region.Deactivate(item); 
      } 
      else 
      { 
       //now check to see if we have any views that were injected 
       var contentControl = item as DocumentPanel; 
       if (contentControl != null) 
       { 
        var injectedView = contentControl.Content; 
        if (Region.Views.Contains(injectedView) && Region.ActiveViews.Contains(injectedView)) 
         Region.Deactivate(injectedView); 
       } 
      } 
     } 

     if (e.Item != null) 
     { 
      var item = e.Item; 

      //are we dealing with a DocumentPanel directly 
      if (Region.Views.Contains(item) && !Region.ActiveViews.Contains(item)) 
      { 
       Region.Activate(item); 
      } 
      else 
      { 
       //now check to see if we have any views that were injected 
       var contentControl = item as DocumentPanel; 
       if (contentControl != null) 
       { 
        var injectedView = contentControl.Content; 
        if (Region.Views.Contains(injectedView) && !Region.ActiveViews.Contains(injectedView)) 
         Region.Activate(injectedView); 
       } 
      } 
     } 
    } 

    private void ActiveViews_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      //are we dealing with a view 
      var frameworkElement = e.NewItems[0] as FrameworkElement; 
      if (frameworkElement != null) 
      { 
       var documentPanel = GetContentPaneFromView(frameworkElement); 
       if (documentPanel != null && !documentPanel.IsActive) 
        documentPanel.ActivateCommand.Execute(null); 
      } 
      else 
      { 
       //must be a viewmodel 
       var viewModel = e.NewItems[0]; 
       var contentPane = GetContentPaneFromFromViewModel(viewModel); 
       contentPane?.ActivateCommand.Execute(null); 
      } 
     } 
    } 

    private DocumentPanel GetContentPaneFromView(object view) 
    { 
     foreach (var baseLayoutItem in _hostControl.Items) 
     { 
      var contentPane = (DocumentPanel) baseLayoutItem; 
      if (contentPane?.Content != null && contentPane.Content == view) 
       return contentPane; 
     } 
     return null; 
    } 

    private DocumentPanel GetContentPaneFromFromViewModel(object viewModel) 
    { 
     foreach (var baseLayoutItem in _hostControl.Items) 
     { 
      var contentPane = (DocumentPanel) baseLayoutItem; 
      var content = contentPane?.Content as FrameworkElement; 
      if (content != null && content.DataContext == viewModel) 
       return contentPane; 
     } 
     return null; 
    } 
} 


public interface IPanelInfo 
{ 
    string Caption { get; set; } 
    void Close(); 
} 
関連する問題