2013-06-27 27 views
1

考慮下面的XAML代碼:如何確定一個視圖有一個具體的控制

<UserControl> 
    <Grid x:Name="UiRoot"/> 
</UserControl> 

現在,在視圖模型,我不得不視圖的參考(從Caliburn.Micro OnViewLoaded)。然後我需要確定View是否有一個名爲UiRoot的網格。

protected override void OnViewLoaded(object view) { 
     base.OnViewLoaded(view); 
    //Does the view have a UiRoot? 
} 

此代碼實際上是在ViewModelBase,有時視圖將有UiRoot,有時不是。它用於在存在時動態創建視圖。

我的第一個想法是創建一個IHasUiRoot接口並將其放在代碼隱藏中。然後我可以將它投射到IHasUiRoot。這有效,但由於我有一個空的Codebehind,我想保持它的方式,並通過反射或其他方式。最後,我需要對實際控件的引用,以便動態地爲其添加控件。

回答

1

如果要實現一個IViewAware視圖模型,如畫面中可以使用IViewAware.GetView()方法(在OnViewLoaded我認爲這是IViewAware反正)得到一個參考視圖

然後你可以使用VisualTreeHelperControl.FindName得到對控件的引用:

var view = this.GetView() as Control; 
if(view != null) 
{ 
    var grid = view.FindName("UiRoot") as Grid; 

    if(grid != null) // do stuff... 
} 
+0

太好了,謝謝。正是我需要的。 –

0

只是一個快速的想法:您正在ViewModel中添加一種對視圖的依賴關係。

解決該問題的一種方法是將代碼移到視圖中;讓它檢查自己並設置一個(依賴)屬性來指向控制UiRoot。

在ViewModel中,您可以添加一個類似的屬性並將它們綁定在視圖代碼中。

這樣,您可以在ViewModel中檢查/使用屬性而不添加視圖相關代碼。

相關問題