【发布时间】: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