0

私は最初のSilverlightプロジェクト(Silverlight 4.0)を開始しようとしており、最良のアプローチなどの研究に時間を費やしています。MVVMを使用する予定で、ここ数日はナビゲーションを調べています。

まず、MVVMの例の多くがMainPageをビュー/ビューモデルとして実装していないことに気づきました。MainPageにはナビゲーションフレームとURIマッピングが含まれており、ビュー/ビューモデルに従うページに移動します。メインページがビュー/ビューモデルとして実装されていないのは、MVVMとナビゲーションサービスを使用する場合の標準ですか?たとえば、Silverlight 4トレーニングキットにはイベントマネージャーのサンプルが含まれており、メインページには多くのコードが含まれています。つまり、NavigateedやNavigatedFailedなどのナビゲーションイベントを処理します。ただし、他のすべてのページは表示/表示モデルです。

次に、ナビゲーションサービスを使用すると、ナビゲーションを変更するロジックがビューによって実行され、ビューモデルによって制御されなくなります(これは、MVVMの背後にあるいくつかの考え方に反します)。ネット上のいくつかのアプローチは、ViewModelからViewへのメッセージングを使用するか、NavigationサービスをViewModelとそこで制御されるナビゲーションに渡します。これらのアプローチのどちらかが他よりも優れていますか?

理想的には、メインページがView / ViewModelの後に続き、ViewModelがナビゲーションを制御し、ビューにコードビハインドがない例を見つけたいと思います。お願いしすぎですか??!

参考までに、PRISMまたはMVVMLightを使用していません。

乾杯

4

1 に答える 1

0

私のプロジェクトでは、MainPage 内にコンテナーを作成し、すべてのビューがそこに読み込まれます。この方法では、コード ビハインドにコードを配置する必要はありません。メイン ページが App の RootVisual として開始されると、MainPage はシェルを作成したクラスを DataContext として受け取ります。コンテナーはこのクラスから DP を受け取り、シェルからのイベントを使用してビューを読み込みます。

コンテナのコー​​ドは次のとおりです。

<ContentControl Name="region1ContentControl" Content="{Binding Path=MainContent}" Style="{StaticResource ContentControlStyle}" Grid.Row="1" Margin="0,30" />

MainContent プロパティ:

public static readonly DependencyProperty MainContentProperty =
        DependencyProperty.Register("MainContent", typeof(System.Windows.Controls.Control),
        typeof(MainPagePresenter), null);
    public System.Windows.Controls.Control MainContent
    {
        get { return (System.Windows.Controls.Control)GetValue(MainContentProperty); }
        set { SetValue(MainContentProperty, value); }
    }

シェル + ビューが読み込まれる場所

var presenter = (Bxf.IPresenter)Bxf.Shell.Instance;

        presenter.OnShowView += (view, region) =>
        {
            if (region.Equals("MainContent", StringComparison.InvariantCultureIgnoreCase))
                MainContent = view.ViewInstance;
            else if (region.Equals("DetailContent", StringComparison.InvariantCultureIgnoreCase))
                DetailContent = view.ViewInstance;
            else
                throw new ArgumentException(string.Format(AppStrings.InvalidRegionName, region));
        };

MainPage 分離コード:

    public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }
}

あなたは見ましたか?注: Prism も MVVM light も使用していません。

于 2012-05-30T17:21:04.527 に答える