2015 年現在、ビュー インジェクションの選択肢は Prism だけですか? 私がプリズムで読んできたものの多くは、5年ほど前のものです. このフレームワークの学習に飛び込む前に、すべてのオプションを検討したいと思います。ビュー インジェクションに関する限り、Prism に匹敵するものはありますか?
2 に答える
MVVM light はもっと... 軽くて使いやすいです。動的注入の場合、これはソースのトリガー (モデルビューでオブジェクトをロードするため) と宛先コントロールの raiseProperty です。
<DataGrid Grid.Column="0" Grid.Row="0" x:Name="dgMain" AutoGenerateColumns="False" SelectionUnit="FullRow" ItemsSource="{Binding Users.items}"
CanUserReorderColumns="True" CanUserResizeColumns="True" CanUserResizeRows="False" CanUserSortColumns="True" CanUserAddRows="False"
LoadingRow="dgMain_LoadingRow" AlternatingRowBackground="#FFEEEEEE" >
<!--DataGrid.DataContext><Binding Source="{StaticResource tblUsers}"/></DataGrid.DataContext-->
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<mvvm:EventToCommand Command="{Binding SendUserCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=dgMain, Path=SelectedItem}"></mvvm:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
私の場合、私はメッセンジャーを使用します
void SendUserInfo(tblUser obj) {
if (obj != null) {
Messenger.Default.Send<MessageCommunicator>(new MessageCommunicator() { Emp = obj, LeMode=mode.Emp });
}
}
void ReceiveInfo() {
Messenger.Default.Register<MessageCommunicator>(this, (obj) => {
if (obj.LeMode == mode.Emp) {
this.UsrInfo = obj.Emp; // Stocke l'objet.
CloneUser(); // Mémorise pour l'éventuel Undo.
} else if (obj.LeMode == mode.Grp) {
this.GrpInfo = obj.Grp;
CloneGrp();
}
leMode = Mode.Edit;
});
}
まず第一に、ビュー インジェクションを行うためのフレームワークは必要ありません。プリズムは、それを実現する方法の一例にすぎません。個人的には、prism.mvvm が好きですが、prism は避けたいと思います。パターンとプラクティスを学ぶのに適しています。
最初に viewmodelと呼ばれる別のアプローチについて説明します。
ビューモデルは常に最初に作成され、次に命名規則またはその他のロジックに基づいてビューが選択されるため、最初にビューモデルと呼ばれます。
部分ビューをシェル ビューに挿入する代わりに、シェル ビューモデルに部分ビューモデルを挿入すると、必要に応じて、挿入されたビューモデルの部分ビューが作成されます。
サンプル シナリオ:
メインウィンドウにタブコントロールがあり、タブを挿入したいとしましょう。
シェル ビューモデルでは、注入されたタブを含むタブ コレクション (それらのビューモデル) を定義します。
public class MainWindowViewModel
{
public MainWindowViewModel()
{
Tabs = new ObservableCollection<ITab>();
}
public ObservableCollection<ITab> Tabs { get; private set; }
}
public interface ITab
{
string Header { get; }
}
MainWindow.xaml では、ビューモデルからビューを作成するコンバーターを使用してそれらを表示します
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}" />
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Converter={StaticResource ViewModelToViewConverter}}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
ViewModelToViewConverter の例はここにあります: https://stackoverflow.com/a/31721236/475727
あとは、タブを Tabs コレクションに挿入するだけです。たとえば、コレクションをモジュールに渡すと、モジュールはタブを挿入します。
インジェクションの代わりに、検出を使用できます。ITab インターフェイスを実装するすべてのクラスを検出し、それらをインスタンス化し、Tabs コレクションに追加するだけです。
利点:
- プリズムから RegionManager を使用する場合のように、文字列を処理する必要はありません。
- shellviewmodelを含むビューモデルを簡単にテストできます
- どのフレームワークにも依存していません。