1

私は、MVVMパターンを実装しようとするSurfaceWPFプロジェクトに取り組んでいます。このプロジェクト内で、さまざまなビューモデルにバインドするいくつかのカスタムコントロールを構築しています。

たとえば、設定ビューモデルを持つ設定コントロールがあり、「全体的な」ビューモデルであるメインビューモデルがあります。

surfacewindows.xamlページでは、mvvm-lightのviewmodelロケーターを使用して、datacontextをメインのviewmodelに設定しています。また、surfacewindow.xamlに設定コントロールを追加し、コントロールでdatacontextを設定viewmodelに設定しました。

ここで、両方のビューモデルが相互作用する必要があります。現在のケースでは、設定コントロールの可視性を設定する必要があります。メインビューモデルにブール値(IsSettingsControlVisible)のプロパティがあり、コンバーターを使用してブール値を可視性オブジェクトに変換することにより、コントロールの可視性プロパティにバインドされます。

この問題は、設定コントロールの閉じるボタンをクリックして表示を非表示に設定する必要がある場合に発生します。コントロールのデータコンテキストを設定ビューモデルに設定したため、メインビューモデルにアクセスできません。

これまで考えてきたのは、設定ビューモデルをプロパティとしてmainviewmodelに追加し、設定コントロールからデータコンテキストを削除することです。settingscontrolでは、バインディングをSettingsProperty.Propertyとして使用します。setttingsコントロールからmainviewmodelにもアクセスできます。それは理にかなっていますか?この種の相互作用を行うためのより良い方法はありますか?

これらの相互作用を実現する方法についてのあなたのアイデアを聞くのが本当に好きです。

4

3 に答える 3

1

CastleWindsorを使用して作成されたビューモデルのグラフを使用する傾向があります。トップレベルのビューモデルは、コンストラクタインジェクションを使用して、必要な次のレベルのビューモデルを受け取ります。また、ビューでは、コンテンツプレゼンターをビューモデルのプロパティにバインドして、対応するビューグラフを作成します。

これを行うと、親子ビューモデルの通信は非常に簡単になりますが、兄弟またはより離れたビューモデルの通信は少し難しくなります。

このような場合、ビューモデルが通信できるようにするために、イベントアグリゲーターまたはメッセンジャーを使用する傾向があります。

于 2012-06-06T09:01:23.073 に答える
1

すでにMVVMLightを使用しているので、MVVMLightツールキットMessengerシステムを使用することをお勧めします。これは、ViewModel間のメッセージ交換を目的としています。背後にある概念は、Mediator patternさまざまなオブジェクトがお互いを知らずに情報を交換する場所です。

次に例を示します。

SettingsViewModelで、設定ダイアログを表示するように指示するイベントに登録します

public SettingsViewModel()
{
  Messenger.Default.Register<ShowSettingsMessage>(this, ShowSettingsDialog);
}

private void ShowSettingsDialog(ShowSettingsMessage showSettingsMessage)
{
  // Set the visibility:
  this.IsVisible = showSettingsMessage.Content;
}

MainViewModelで、メッセージにラップされた通知を送信します。

// make the settings visible, e.g. the button click command:    
Messenger.Default.Send(new ShowSettingsMessage(true));

そしてここにメッセージがあります:

// the message:
public class ShowSettingsMessage : GenericMessage<bool>
   {
     public ShowSettingsMessage(bool isVisible)
       : base(isVisible)
     {  }
   }

別のコンテキストでを使用したり、削除/交換したりする可能性がなくなるためSettingsViewModel、のプロパティを作成することはお勧めしません。MainviewmodelSettingsViewModel

于 2012-06-06T09:26:17.547 に答える
0

IsSettingControlVisibleという設定コントロールに依存関係プロパティを作成し、それを親のviewModelにバインドしてみてください。

編集:

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


        public int MyProperty
        {
            get { return (int)GetValue(MyPropertyProperty); }
            set { SetValue(MyPropertyProperty, value); }
        }

        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyPropertyProperty =
            DependencyProperty.Register("MyProperty", typeof(int), typeof(UserControl1), new UIPropertyMetadata(0));
    }

このように使用します...

 <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <local:UserControl1 MyProperty="{Binding Path=ParentViewModelProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
        </Grid>
    </Window>
于 2012-06-06T09:00:37.263 に答える