我有我的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;
};
最大的问题是,在控件加载和数据绑定已经完成之前,我无法获得父窗口?我是否必须创建一个附加行为,这对于简单绑定来说是非常痛苦的。
答案 0 :(得分:0)
不具约束力吗?
<Window IsActive="{Binding Path=IsActive, Mode=OneWayToSource}"/>
这意味着设置窗口的DataContext。
或者如果您想在用户控制标记中使用窗口状态,请尝试此绑定:
PropValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=IsActive}"