3

私は初めての WPF アプリケーションを作成しているので、この質問は奇妙に思えるかもしれません。私はMVVMについて読んできましたが、これまでのところ、それは私にとって理にかなっています。私が理解していないのは、すべての XAML を分離することです。

つまり、MainWindow.xaml にすべてを配置するのではなく、使用するものに基づいてコントロールを折りたたむだけであると仮定します。他のファイルの xaml を含むコンテナーが必要になると思います。これは正しいです?

XAML を分離して、すべてが 1 つのファイルにまとめられないようにするにはどうすればよいでしょうか。

4

3 に答える 3

6

XAML を分離して、すべてが 1 つのファイルにまとめられないようにするにはどうすればよいでしょうか。

UserControl別の、CustomControlまたはを作成するなど、多くの方法があります。PageWindow

たとえば、 から一部XAMLを取り出したい場合は、次のように呼び出される(右クリック プロジェクト、AddNew Item...User Control (WPF)MainWindow.xaml )を作成できます。UserControlMyUserControl.xaml

<UserControl x:Class="WpfApplication1.MyUserControl"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Grid>
        <TextBlock>This is from a different XAML file.</TextBlock>
    </Grid>
</UserControl>

次に、このコントロールを次のMainWindow.xamlように使用します。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:myControls="clr-namespace:WpfApplication1">
    <Grid>
        <myControls:MyUserControl/>
    </Grid>
</Window>

あなたの名前空間への参照を追加する必要があることに注意してくださいUserControl

xmlns:myControls="clr-namespace:WpfApplication1"
于 2012-07-08T22:53:11.303 に答える
2

UserControl と Window に関する Kevin の回答に同意するので、フォローアップの質問に答えます。

ユーザーがアプリケーションを操作しているときに、MainWindow のコンテンツで折りたたまれている/表示されているさまざまなコントロールを切り替える必要がありますか?

これは有効なオプションです。大規模なアプリケーションで作業している場合は、面倒になる可能性があります。

私が使用した他のオプションは

  • コードビハインドでビューを切り替えます。つまり、クリック イベントでは、WinForms で行ったように、ページから要素を追加および削除できます。これは純粋な MVVM ではなく、何人かの人々はあなたの喉から飛び降りますが、MVVM は宗教ではなくツールであると私は信じています。
  • ViewModel で View をプロパティとして提供し、親 View からそれらにバインドします。これが純粋な MVVM かどうかはわかりません。複雑な条件に応じてビューを動的に作成する必要がある場合は便利ですが、複雑になる可能性があります。
  • DataTemplates を使用します。これは基本的に、提供されるデータの種類に基づいて使用するビューを決定するためのルールです。したがって、データがAddress(またはAddressViewModel) の場合は、AddressView. データが の場合は、CustomerViewModelを使用しCustomerViewます。等々。

私の意見では、DataTemplates は好ましいパターンです。クリーンで、保守が容易で、優れた標準です。バインドがどのように機能するかを確認するために DataTemplate に移動するのは簡単ですが、私が指定した他の 2 つのオプションでは、スパゲッティ コードが悪用される可能性があります。

MSDN には、 WPF の DataTemplatesに関するすばらしいページがあります。

于 2012-07-09T00:52:31.157 に答える
1

Caliburn フレームワークを使用する場合、小さなビューとビューモデルを使用してアプリケーションを構成し、それらすべての小さなビューをバインドするシェルを持つことができます。アプリケーションの動作方法に応じて、シェルは同時に 1 つまたは複数のビューを表示します。これの良いところは、他の場所で View/UserControl の名前をハードコードする上記のパターンとは異なり、ContentControl を作成して正しい ViewModel プロパティにバインドするだけで、Caliburn が正しいビューを見つけてくれることです。大会。

空のウィンドウである ShellViewModel と ShellView があり、ある時点でシェルに表示したい別の View/ViewModel があるとします。どこでもビューをインスタンス化する必要はなくなり、POCO ViewModels オブジェクトを使用して作業するだけです。

public class ShellViewModel : Screen
{
   public ChildViewModel Child { get; set; }

   public void SomeAction()
   {
       Child = new ChildViewModel(); //Or inject using factory, IoC, etc.
   }
}

public class ShellView : Window
{
}

<Window x:Class="WpfApplication1.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:cal="http://www.caliburnproject.org">
    <Grid>
        <ContentControl cal:View.Model="{Binding Child}" />
    </Grid>
</Window>
于 2012-07-09T00:26:18.640 に答える