あなたはだましています。それは4つの質問です!
1)
ビューとビューモデルをグループ化する方法に関しては、ビューとビューモデルを同じ名前空間/フォルダーに配置し、機能に基づいて別のフォルダーに分ける人を見てきました。あなたにとって最良の選択肢は、あなた/あなたのチームに合ったものです. 「正しい」方法はありません。
2)
乾いた状態に保ちます-同じことを繰り返さないでください. コードを再利用することは非常に賢明です。共通のクラスがある場合は、それらを共通に保ちます。命名に関しては、クラスの名前はそれが何をするかを説明するのに役立つはずです: クラス NavigationService、NavigationMenuItem、および NavigationMenuView が何をしたかを理解できると確信しており、おそらくどのように良いメンタル モデルをまとめることができるでしょう。彼らは関係しています。したがって、クラス BlahViewModel または BlahModel に名前を付けることが役立つ場合は、そうしてください。
3) ビューの実装:
Window は常に独立して表示されます。ページは、ナビゲーション アプリケーション (通常、Internet Explorer などの [戻る] ボタンと [進む] ボタン) で使用することを目的としています。ページは、NavigationWindow または Frame でホストする必要があります。コンテンツの動的な追加/削除、ItemsControls (TabControl など) へのコンテンツの追加を検討している場合は、ユーザー コントロールを作成する必要があります。ユーザー コントロールを Page および Window オブジェクト、他のコントロールなどに配置することができ、WPF 開発者にとって実際に役立っています。
4)
ここにはいくつかのオプションがあります。
1)手っ取り早い方法は、タイプ X の ViewModel が与えられると、ViewModel をロードしてデータ コンテキストに適用する DataTemplate を作成することです。これにより、ViewModel をコントロールに直接挿入し、正しいビューをレンダリングできます。
例:
View.xaml
<ContentControl Content="{Binding Error, Mode=OneWay}" />
ビューモデル:
private void ReceiveError(ErrorViewModel errorModel)
{
//if (errorModel.AcceptCommand==null || errorModel.AcceptCommand is NoOpCommand)
errorModel.AcceptCommand = new DelegateCommand(ClearError);
Error = errorModel;
}
public ErrorViewModel Error
{
get { return _error; }
set
{
_error = value;
_propertyChangedHelper.NotifyPropertyChanged(this, () => Error);
}
}
Styles.Xaml (ResourceDictionary)
<DataTemplate DataType="{x:Type vm:ErrorViewModel}">
<DataTemplate.Resources>
<conv:CustomisableBooleanToVisibilityConverter x:Key="VisibilityConverter" TrueValue="Visible" FalseValue="Collapsed" />
</DataTemplate.Resources>
<Popup AllowsTransparency="True" PopupAnimation="Fade" Placement="Center" StaysOpen="True"
PlacementTarget="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type v:ModuleView}}}"
IsOpen="True" Width="400" SnapsToDevicePixels="True"/>
ビューモデルをコンテンツ コントロールに直接挿入し、ビューモデルの型にバインドされたデータ テンプレートを使用してそのビューを見つけていることがわかります。
2)
DataTemplateSelector を使用することをお勧めします。これにより、基本的に、コントロールで使用できるテンプレートを指定し、コーディングしたロジックを使用して、使用するデータ テンプレートを決定できます。この例はここにあります。
3)
UI コントロールを抽象化するフレームワークを使用します。Microsoft には、Prism と呼ばれるこれを行うフレームワーク (無料) があります。基本的に、ユーザー コントロールを TabControl、ItemsControl などに直接追加する代わりに、コントロールを名前付きの "Region" に追加します。この領域は基になるコントロールにマップされ、ユーザーが要求したときにその UserContorl が追加/削除される方法を管理するためにアダプターが配置されます。この詳細については、こちらを参照してください。ただし、Prism はアプリケーション フレームワークであるため、これを実装するのに 3 時間もかからないことに注意してください。