2012-09-04 184 views
0

我有我的WPF控件设置,以便它只有下面的代码:如何绑定到用户控件的父窗口IsActive属性

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

你有没有试图改变结合“变种isActiveWindowBinding =新的绑定(‘IsActive’){源=模型。 IsActive,UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};'你的IsActive **属性**实现了一个PropertyChanged方法 –

+0

@Bob我会试一下,但它仍然会污染什么可能是这样一个干净的代码隐藏,这是我的问题的主要部分 –

回答

0

不具约束力的工作?

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

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

或者,如果你想使用的用户控件标记窗口的状态下,试试这个结合:

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

这是一个用户控件,而不是一个窗口。 –

+0

@JustinPihony我更新了我的答案。 –

+0

我已经想到了,但是什么是PropValue?这将需要是IsActive,它只在窗口上,而不是UserControl –

相关问题