-
以前に 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 フレームワークの利点です。