2012-10-19 51 views
1

我有一個視圖,它包含一個ContentControl,它的ContentTemplate根據視圖模型中的布爾屬性動態更改,使用數據觸發器。觸發數據觸發後設置控件的DataContext

 <ContentControl> 

      <!-- MyFirstControl user control by default--> 
      <local:MyFirstControl/> 

      <ContentControl.Style> 
       <Style TargetType="ContentControl">       
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsSelected}" 
            Value="True"> 
          <Setter Property="ContentTemplate"> 
           <Setter.Value> 
            <DataTemplate> 
             <!-- Different user control when trigger fired--> 
             <local:MySecondControl /> 
            </DataTemplate> 
           </Setter.Value> 
          </Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 

     </ContentControl> 

的MySecondControl用戶控制,當觸發觸發器旨在顯示正文塊,其中其Text屬性綁定到一個屬性也相同視圖模型內,其顯示。

我顯然是錯的,但我的想法是,觸發的控件會繼承相同的數據上下文。相反,它試圖使用MyFirstControl用戶控件作爲其數據上下文(我也收到此錯誤:System.Windows.Data錯誤:40:BindingExpression路徑錯誤:)。

我試圖明確規定的觸發控制與數據上下文:但是它仍然使用默認的控制(MyFirstControl)作爲其數據上下文

<local:MySecondControl DataContext="{Binding}"/> 

我的問題是,我如何強制觸發的控件使用相同的數據上下文作爲它所在的視圖文件?

我對WPF場景相當陌生,所以我希望這是有道理的!

在此先感謝。

回答

1

ContentContentTemplate之間的差異。

Content是控制你的實際內容,而ContentTemplate定義如何繪製Content

您的Content屬性設置爲MyFirstControl。您的觸發器正在更改ContentTemplate媒體資源,因此它會更改您的內容(MyFirstControl)的繪製方式,因此使用MySecondControl繪製它,但Content本身未更改,因此DataContext仍將是您的MyFirstControl

您可能想要將默認ContentTemplate設置爲MyFirstControl而不是實際的Content屬性。

<ContentControl> 

    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <!-- Set default ContentTemplate --> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <local:MyFirstControl /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 

      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsSelected}" 
          Value="True"> 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <!-- Different user control when trigger fired--> 
           <local:MySecondControl /> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 

</ContentControl> 
+0

非常感謝! – user1097734

0

希望這將幫助:

<local:MySecondControl DataContext="{Binding Path=DataContext, 
        RelativeSource={RelativeSource TemplatedParent}}"/> 
相關問題