2012-09-11 89 views
0

我刪除了我的MainWindow.xaml的CodeBehind,因爲我正在做一個小型項目,我從字面上必須這樣做。從XAML獲取DataContext

所以我以這種方式在XAML創建我的ViewModel的一個實例:

<Grid.DataContext> 
    <lib:StartPageViewModel /> 
</Grid.DataContext> 

現在好了,我需要這個DataContext在我的代碼(StartPageViewModel),因爲我想打開其他的解決辦法(欲瞭解更多信息,請看here)。

任何想法,我怎麼可以得到這個DataContext?

+0

您可以分別定義一個靜態資源,其值爲lib:xaml中的StartPageViewModel,然後您可以在網格中綁定相同的資源,並在視圖模型中綁定新的屬性,以使兩者具有相同的對象。 –

回答

1

至少我解決了這個問題。 其實我並不真的需要使用的DataContext此:

public static DTE2 GetDTE(DataContext dataContext) 
    { 
     ICustomTypeDescriptor typeDescriptor = dataContext as ICustomTypeDescriptor; 
     Debug.Assert(typeDescriptor != null, "Could not get ICustomTypeDescriptor from dataContext. Was the Start Page tool window DataContext overwritten?"); 
     PropertyDescriptorCollection propertyCollection = typeDescriptor.GetProperties(); 
     return propertyCollection.Find("DTE", false).GetValue(dataContext) as DTE2; 
    } 

我改變了代碼以下,現在的工作很好,我可以開放的解決方案,而無需使用的DataContext:

public static DTE2 GetDTE() 
    { 
     return (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"); 
    } 
0

ViewModel不應該對視圖有任何瞭解。

因此,當應用'正確的'MVVM時,您不應該試圖從ViewModel中訪問DataContext。

StartPageViewModel的代碼是置於DataContext中的對象的一部分。這意味着您可以通過在ViewModel的代碼中使用this來訪問該對象。

如果你正在尋找的網格(甚至更高了的VisualTree),你可以使用在XAML屬性傳遞:

<Grid Name="MyGrid"> 
    <Grid.DataContext> 
     <lib:StartPageViewModel MyParent={Binding ElementName=MyGrid} /> 
    </Grid.DataContext> 
</Grid> 

不過,如果你這樣做,你要添加有關知識查看ViewModel。

+0

'this'是'StartPageViewModel',你能告訴我如何使用'this'來訪問DataContext嗎?因爲我現在只能訪問屬性.. – eMi

+0

你想用DataContext做什麼? –

+0

至少我解決了它 – eMi

0

我從來沒有宣佈在XAML文件中的視圖模型,但你有沒有嘗試過:

viewName.DataContext as ViewModelType; 

BTW,刪除代碼隱藏通常是一個很好的做法。

+0

視圖是在另一個項目中,所以我無法訪問視圖名稱,因爲這意味着我有循環依賴項。 ViewModel在我的其他項目中,並且不能有對XAML項目的引用。 – eMi

相關問題