0

次のコードのみが含まれるように、WPF コントロールを設定しました。

  InitializeComponent();
  DataContext = model; 

ただし、ウィンドウがアクティブでないときに特定のアクションを発生させたくないという問題が発生したため、ViewModel に IsActive フラグを作成しましたが、コードはウィンドウではなくユーザー コントロールから取得されているため、ユーザーコントロールにコードビハインドがないと、これを行うことはできません。これは私ができる最善のことですか、それともこれに対する真のMVVMアプローチはありますか

これを試してみましたが、IsActivePropertyデータ バインドできないというランタイム エラーが発生しました。

 Loaded += (sender, args) =>
              {
                var parentWindow = Window.GetWindow(this);
                if (parentWindow == null)
                  return;
                var isActiveWindowBinding = new Binding {Source = model.IsActive};
                parentWindow.SetBinding(Window.IsActiveProperty, isActiveWindowBinding);
              };

だから、私はこれをしていません:

 Loaded += (sender, args) =>
              {
                var parentWindow = Window.GetWindow(this);
                if (parentWindow == null)
                  return;
                parentWindow.Activated += (o, eventArgs) => model.IsActive = true;
                parentWindow.Deactivated += (o, eventArgs) => model.IsActive = false;
              };

最大の問題は、コントロールが読み込まれてデータバインディングが完了するまで、親ウィンドウを取得できないことです。アタッチされた動作を作成する必要がありますか?これは、単純なバインドでは非常に面倒です。

4

1 に答える 1

0

バインディングは機能しませんか?

<Window IsActive="{Binding Path=IsActive, Mode=OneWayToSource}"/>

これは、ウィンドウの DataContext が設定されていることを意味します。

または、ユーザー コントロール マークアップでウィンドウの状態を使用する場合は、次のバインディングを試してください。

PropValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=IsActive}"
于 2012-09-04T20:29:00.437 に答える