2012-10-08 47 views
1

我有一個ContentControl,我需要動態地將它設置爲ContentTemplate無法動態更改內容模板

,所以我決定寫2 DataTemplates,然後我的樣式這樣ContentControl一個觸發器觸發,並設置適當的模板(DT1/DT2)時,在我看來,模型的變化布爾依賴屬性(真/假)。

但問題是,如果布爾屬性主要設置爲true,數據模板總會dt1和更改屬性false模板不會改變dt2

由於數據觸發器綁定到布爾依賴屬性,不應該更改屬性結果觸發觸發器?

筆記:

  • 有在MyView一個按鈕,改變BooleanDependencyProp它是 click事件。
  • MyViewModel繼承自接口 實現INotifyPropertyChanged

的XAML:

<UserControl x:Class="Views.MyView"> 
... 

<StackPanel> 
    <ContentControl Content="{Binding RelativeSource={RelativeSource AncestorType=MyView}, Path=MyViewModel}"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding BooleanDependencyProp}" Value="true"> 
               <Setter Property="ContentTemplate"> 
                <Setter.Value> 
                 <dt1 ... /> 
                </Setter.Value> 
               </Setter> 
        <DataTrigger Binding="{Binding BooleanDependencyProp}" Value="false"> 
               <Setter Property="ContentTemplate"> 
                <Setter.Value> 
                 <dt2 ... /> 
                </Setter.Value> 
               </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</StackPanel> 
+1

您可以查看ContentTemplateSelector屬性。 –

+0

我試過了,但是和templateSelector一樣。它初始化一次,它不能有依賴屬性,所以我無法設置任何綁定。 –

回答

1

這是WPF框架的一個已知的缺點,如果你要申請不同的數據模板,要麼通過使用可視化狀態管理器更改演示文稿,或換出對於基於觸發器更改的用戶控件的內容數據模板,您將獲得更多里程。

還有很多我可以說,但它會涉及知道你的情況和這些DataTemplates的差異,爲什麼你是歧義等等。此外,MVVM四處?或者帶有幾個視圖模型的直線代碼+標記樣式?

+0

我明白了,那麼我會檢查你的解決方案,謝謝。它是MVVM/3Tier與存儲庫等,也是我的第一個WPF應用程序,所以我不知道這是什麼最好的解決方案。基本上我可以簡單地更改代碼中的模板,但我認爲嘗試純xaml。 –

+0

我會研究使用WPF視覺狀態管理器,定義DataTrigger/GoToStateAction對。這是使用Blend 4最簡單的方法 – Firoso