如何绑定到用户控件的父窗口IsActive属性

时间:2012-09-04 20:16:20

标签: c# wpf mvvm user-controls window

我有我的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;
              };

最大的问题是,在控件加载和数据绑定已经完成之前,我无法获得父窗口?我是否必须创建一个附加行为,这对于简单绑定来说是非常痛苦的。

1 个答案:

答案 0 :(得分:0)

不具约束力吗?

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

这意味着设置窗口的DataContext。

或者如果您想在用户控制标记中使用窗口状态,请尝试此绑定:

PropValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=IsActive}"