6

私のWPFプロジェクトは次のように構成されます。

Screens
   Group1
      Screen1
         View.xaml
         ViewModel.cs
   Group2
      Screen2
         View.xaml
         ViewModel.cs

Screen1からを表示するには、次のScreen2ようなものを使用します。これは、ViewとViewModelの名前空間でScreenManager.Show("Group1.Screen1")(リフレクションを使用して)表示され、それらをインスタンス化します。Screens.Group1.Screen1

Screen1結合せずにマジックストリングを削除するにはどうすればよいですか(クラスで名前空間を使用しScreen2たくない)。また、ある種の画面検出(オートコンプリート/インテリセンス)が欲しいです Screen2Screen1

ScreenManager.Showまたは、へのすべての呼び出しが有効であることを確認するための何らかの方法(自動テスト) 。

更新: 私はこれを思いついた:

public class ScreenNames
{
    public Group1Screens Group1;

    public class Group1Screens
    {
        public ScreenName Screen1;
    }
}

public sealed class ScreenName
{
    private ScreenName() { }
}

public class ScreenManager : IScreenManager
{
    public void Show(Expression<Func<ScreenNames, ScreenName>> x) {}
}

使用法:

screenManager.Show(x=>x.Group1.Screen1);

理想的ではありませんが、DRYに違反することはマジックストリングよりも優れていると思います。そして、すべての呼び出しが有効であることを(リフレクションを使用して)自動的にテストできます。

4

2 に答える 2

3

DataTemplateエンジンが純粋なマークアップでこれを処理できるため、WPFにScreenManagerのものすべてが必要なわけではありません。

アプリケーションの特定の領域をContentPresenterと一連のDataTemplatesで簡単にデータバインドできます。エリアを「root」ViewModelのプロパティにバインドし、「root」ViewModelにINotifyPropertyChangedを実装させて、そのエリアでViewModelを変更したかどうかをWPFが認識できるようにします。

public class RootViewModel : INotifyPropertyChanged
{
    public object Screen1ViewModel { get; }

    public object Screen2ViewModel { get; }
}

1つのContentPresenterコントロールをScreen1ViewModelプロパティにデータバインドします。

<ContentControl Content="{Binding Path=Screen1ViewModel}" />

次の場合も同様です。Screen1のコンテンツを変更する必要がある場合は、コードからScreen1ViewModelを再割り当てするだけで、PropertyChangedイベントが発生したため、WPFはそれを取得し、新しいViewModelを新しいビューにバインドします。

DataTemplatesは、次のように単純な場合があります。

<Window.Resources>
    <DataTemplate DataType="{x:Type foo:MyViewModel}">
        <self:MyControl />
    </DataTemplate>
    <DataTemplate DataType="{x:Type foo:MyOtherViewModel}">
        <self:MyOtherControl />
    </DataTemplate>
</Window.Resources>

よく知らない方のために説明すると、WPFのMVVMに関するこの記事は優れた入門書です。

于 2010-02-10T20:22:25.273 に答える
0

最後に、T4コード生成を使用してScreenNamesクラスを生成しました。私はこのコードを適応させることによってそれを行いました:ASP.NETWebアプリケーションのすべてのユーザーコントロールに対して強力な型付きナビゲーションクラスを自動生成します

于 2010-02-14T21:49:33.403 に答える