2012-09-04 219 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 –

相關問題