1

2015 年現在、ビュー インジェクションの選択肢は Prism だけですか? 私がプリズムで読んできたものの多くは、5年ほど前のものです. このフレームワークの学習に飛び込む前に、すべてのオプションを検討したいと思います。ビュー インジェクションに関する限り、Prism に匹敵するものはありますか?

4

2 に答える 2

0

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;
        });
    }
于 2015-08-27T06:57:34.550 に答える
0

まず第一に、ビュー インジェクションを行うためのフレームワークは必要ありません。プリズムは、それを実現する方法の一例にすぎません。個人的には、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を含むビューモデルを簡単にテストできます
  • どのフレームワークにも依存していません。
于 2015-08-27T08:40:52.807 に答える