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 回答