【问题标题】:How to bind to user control's parent window IsActive property如何绑定到用户控件的父窗口 IsActive 属性
【发布时间】:2012-09-04 20:16:19
【问题描述】:

我设置了 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;
              };

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

【问题讨论】:

  • 您是否尝试将绑定更改为 'var isActiveWindowBinding = new Binding("IsActive") {Source = model.IsActive, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};'您的 IsActive property 实现了 PropertyChanged 方法
  • @Bob 我会尝试,但它仍然会污染可能如此干净的代码隐藏,这是我问题的主要部分

标签: c# wpf mvvm user-controls window


【解决方案1】:

绑定不起作用吗?

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

这里的意思是设置了窗口的DataContext。

或者如果你想在用户控件标记中使用窗口的状态,试试这个绑定:

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

【讨论】:

  • 这是一个用户控件,而不是一个窗口。
  • 我已经想到了,但是 PropValue 是什么?那需要是 IsActive,它只在 Window 上,而不是 UserControl
  • 现在我不明白你想要什么。 Window 有它的 IsActive 属性。根据它的值,您想在 ViewModel/UserControl 中启用或禁用操作?
  • 我有一个用户控件,我想将它的父窗口属性绑定到用户控件的模型。不过,直到运行时我才知道 Window。
  • 这可以是一种解决方案:stackoverflow.com/questions/7538314/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多