2015-09-24 51 views
0

最近我一直在試驗WPF,Xaml,MVVM和DependencyInjection。因此,我正在使用MVVM原理創建一個UI。 UI的某個部分被設計爲像一個嚮導,其中不是所有可用選項都同時呈現給用戶。選項的每個部分都是它自己的View(子視圖),其中一個View(父視圖)在ContentControl中託管這些子視圖。用戶設置某些選項並使用按鈕從一個部分移動到另一個部分。將父視圖DataContext綁定到DataTemplate子視圖DataContexts

視圖導航

要在這些視圖我使用的是每個子視圖中DataTemplateSelector定義爲我的XAML資源一個DataTemplate之間切換。

在主視圖內容控制:

 <ContentControl Content="{Binding ElementName=ParentViewControl, Path=ViewState, Mode=TwoWay}" 
        ContentTemplateSelector="{StaticResource MyTemplateSelector}" /> 

舉例子查看數據模板:

<DataTemplate x:Key="SubViewATemplate"> 
     <local:SubViewAView x:Name="SVAView" DataContext="{Binding ElementName=ParentViewControl, Path=DataContext}" ViewState="{Binding ElementName=ParentViewControl, Path=ViewState, Mode=TwoWay }" /> 
    </DataTemplate> 

父視圖和每個子視圖我創建一個依賴屬性稱爲視圖狀態(一個枚舉)。這些通過DataTemplates彼此綁定。在每個View的代碼隱藏中,我根據用戶輸入更新此ViewState屬性,並將其傳播到父視圖,然後觸發DataTemplateSelector。到現在爲止還挺好。導航工作非常好。

視圖模型信息

父視圖具有視圖模型,其實現INotifyPropertyChanged作爲其DataContext的。我試圖使用這個ViewModel將屬性綁定到父視圖和子視圖。問題是上面的DataTemplate代碼片段中的DataContext綁定不起作用。 (自ViewState綁定以來,這對我來說很奇怪。)經過各種嘗試使其發揮作用後,子視圖上的DataContext或者爲null,或者爲ViewState控件變量。

我目前使用UnityContainer作爲我的依賴注入器。

各種嘗試

這裏有各種其他的事情我已經試過了都失敗了:

1)註冊視圖模型作爲UnityContainer單身從而使用於子構造器注入視圖來設置DataContext。 (不起作用,因爲必須有DataTemplate資源的無參數構造函數。)

2)在UnityContainer中將ViewModel註冊爲單例,然後在子視圖上使用Property註釋來設置DataContext。 (不起作用,我認爲這是由於在Xaml中實例化UnityContainer時不起作用)。

3)爲每個需要ViewModel的子視圖創建sub-ViewModel以顯示將存在的屬性在父視圖模型上。我之前使用過這個來解決UnityContainer中的Xaml實例化問題。然後,我用相關的子ViewModel替換DataTemplate中的DataContext綁定。 (不起作用,因爲由於某種原因,我的父視圖的DataContext被設置爲ViewState變量,而不是保留我在視圖的構造器中設置的ViewModel,這意味着我的Parent ViewModel上的子ViewModel屬性可以找不到綁定到子視圖的DataContext。)UserControl的Content和DataContext是同一件事情嗎?設置一個會影響另一個嗎?

4)將ViewState依賴項屬性從View移動到ViewModel,然後將ContentControl的Content設置爲綁定到ViewModel。這違反了MVVM的原則,但到目前爲止,我正在嘗試任何方法來實現這一點。 (它不起作用,因爲ViewState在視圖的代碼隱藏中更改後,ViewModel不會觸發更改。)我沒有更進一步,因爲我不想更深入地違反MVVM。

結論

我發現大多數的這些嘗試的解決方案在這個網站在過去的幾天。我沒有接受任何WPF,Xaml和MVVM的正式培訓,所以我懷疑我錯過了一些明顯的東西,或者試圖做一些不可能的事情。我會繼續嘗試對上述內容進行修改並進行研究,直到找到有效的方式,但我想我會利用這裏的集體知識來幫助我找到解決方案。

我更喜歡讓視圖組使用單個ViewModel作爲它們的DataContext,這樣我就可以將屬性綁定到它們的控件。並通過DataTemplateSelector控制視圖的導航。有沒有辦法做到這一點,我沒有看到?

謝謝你的時間!

回答

0

我以前有類似的問題,我已經使用RelativeSource綁定祝你好運。也許嘗試這樣的:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=DataContext}" 

只是一個想法。

+0

感謝您的迴應!我想類似的東西: '綁定= 「{綁定路徑= DataContext.MyBindingProperty, 的RelativeSource = {的RelativeSource AncestorType = {X:類型用戶控件}}}」 ' 沒有工作,但你的建議呢!非常感謝你。我想知道我是否命名了ContentControl並將它的名稱用於ElementName,如果這也可以。這樣我就不必依賴視覺樹。我會給它一個迴應。 –

+0

我的實驗工作。我從上面的「ViewArea」命名我的ContentControl並將其作爲DataTemplate中的綁定使用: 'DataContext =「{Binding ElementName = ViewArea,Path = DataContext,Mode = TwoWay}」' 。所以這兩個都可以工作。 我曾經見過這兩個語法示例,但不知道哪個控件可以找到DataContext。小但很重要。再次感謝@trippedOverXaml –

+0

我很高興它有幫助,我一定會很快嘗試你的實驗!感謝您的更新:D(編輯,因爲我似乎無法拼寫) – trippedOverXaml

相關問題