.net wpf の CM フレームワークの次のコード行は、複数ページの管理を実現します。

  • 以前に wpf プロジェクトの練習をしたことがあります。メイン ページの左側はリストボックスで、各選択を変更すると対応するページが表示されます。インターフェイス図は次のとおりです。

このような機能を実現するために、以前は従来の方法で実現していましたが、ここでは CM フレームワークの下で Conductor<T> を使用して実現することで、コード量を大幅に削減でき、コア コードは 2 つだけです。一行。

伝統的な方法

  バックグラウンドコード:

① コレクションを定義し、データを追加します。

  public IViewModel ActiveWindowView { get; set; }
        public ObservableCollection<string> ListBoxItems { get; set; } 
        public string SelectedItem { get; set; }

ListBoxItems = new ObservableCollection<string>() { };
            ListBoxItems.Add("ShellView");
            ListBoxItems.Add("EventAggregatorView");
            ListBoxItems.Add("ConductorView");
            ListBoxItems.Add("MatchTemplateView");
            ListBoxItems.Add("IndicatorLightView");
            ListBoxItems.Add("MemorandumView");
            ListBoxItems.Add("FTPTestView");

②リストボックスの選択を変更した後、ページを切り替えます。

public void ListBoxItems_SelectionChanged()
        {
           switch(SelectedItem)
            {
                case "ShellView":
                    ActiveWindowView = new ShellViewModel();break;
                case "EventAggregatorView":
                        ActiveWindowView = EventAggregatorViewModel.Instance; break;
                case "ConductorView":
                    ActiveWindowView = new ConductorViewModel(); break;
                case "MatchTemplateView":
                    ActiveWindowView = new MatchTemplateViewModel(); break;
                case "IndicatorLightView":
                    ActiveWindowView = new IndicatorLightViewModel(); break;
                case "MemorandumView":
                    ActiveWindowView = IoC.Get<MemorandumViewModel>(); break;
                case "FTPTestView":
                    ActiveWindowView = new FTPTestViewModel(new FTPConfig()); break;
                default:break;
            }
        }

③前景バインディング:

<ListBox Name="ListBoxItems" Grid.Column="0" 
   SelectedItem="{Binding SelectedItem}" Margin="2"
   cal:Message.Attach="[Event SelectionChanged] = [Action ListBoxItems_SelectionChanged]"/>
<ContentControl Name="ActiveWindowView"/>

CM フレームワークで Conductor<T> を使用して実現します

 ①背景コード:

まず、このクラスのメソッドとプロパティを使用できるように Conductor<IViewModel>.Collection.OneActive を継承する必要があります。次に、コンストラクターで受信インターフェイスを追加する必要があります。

IEnumerable<T> の場合、変更されたコードは次のとおりです。

 public MainWindowViewModel(IEnumerable<IViewModel> modules)
        {
            Items.AddRange(modules);
            ActivateItem(Items.FirstOrDefault(vm => vm.GetType() ==typeof(IndicatorLightViewModel)));
        }

初めてアクティブ化されたページを考慮しない場合、コア コードは 1 つの文だけです。

 Items.AddRange(modules);

②フォアグラウンドコード:

 <ListBox Name="Items" Grid.Column="0"  Margin="2" DisplayMemberPath="DisplayName"/>
  <ContentControl Name="ActiveItem"/>

このように表と裏を設け、フレームワークのマルチ画面管理クラスを継承することで、表と裏のコードが大幅に簡略化され、機能も損なうことなく、正確に言うとより強力になっています。これが CM フレームワークの利点です。

おすすめ

転載: blog.csdn.net/qq_41872328/article/details/126741338