2012-02-20 31 views
3

我想切換基於datatrigger.contentPresenter的內容我想在contentpresenter.content中顯示一個usercontrol,如果我有一個值集或否則我需要顯示一個錯誤message.But綁定在我的datatrigger失敗,說明該屬性沒有found.I無法獲取datacontext繼承爲datatrigger檢查。我可以通過使用註釋掉的代碼使其工作。但我很困惑,爲什麼它doesn'按照正常的方式工作。Datapreguer on contentpresenter.content不工作

<ContentPresenter.Style> 
      <Style TargetType="{x:Type ContentPresenter}"> 
        <Setter Property="Content" Value="{Binding UC}"/> 
       <Style.Triggers> 
        <!--<DataTrigger Binding="{Binding DataContext.HasValue,RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" Value="false"> 
         <Setter Property="Content" Value="No preview"/> 
        </DataTrigger>--> 
        <DataTrigger Binding="{Binding HasValue}" Value="false"> 
         <Setter Property="Content" Value="No value"/> 
        </DataTrigger> 

       </Style.Triggers> 

      </Style> 
     </ContentPresenter.Style> 
    </ContentPresenter> 

回答

-2

我通常使用觸發器就像這個...

     <UserControl> 
          <UserControl.Resources> 
           <DataTemplate x:Key="normalTemplate" > 
            <!-Fav UserControl-> 
           </DataTemplate > 
           <DataTemplate x:Key="overWriteTempalte"> 
            <!-Fav UserControl->         </DataTemplate> 
          </UserControl.Resources> 
          <ContentPresenter x:Name="ContentField" 
               Content="{Binding}" 
               ContentTemplate="{StaticResource ResourceKey=normalTemplate}" /> 
          <UserControl.Triggers> 
           <DataTrigger Binding="{Binding Path=MyProperty}" Value="True"> 
            <Setter TargetName="ContentField" Property="ContentTemplate" Value="{StaticResource ResourceKey=overWriteTempalte}" /> 
           </DataTrigger> 
          </UserControl.Triggers> 
         </UserControl> 

如果綁定是一個問題,使用Snoop檢測結合的錯誤

+0

這是不對的。 UserControl上的觸發器必須是EventTrigger類型的。 – Joe 2013-07-24 21:20:59

+0

@Joe:對於正確答案的任何想法? – IAbstract 2016-08-28 13:46:54

+0

@IAbstract綁定fr用戶控件不能通過給定類型來完成......需要聲明一個靜態資源fr用戶控件實例,然後綁定,因爲內容將起作用。 喬 - 因爲此用戶控件正在顯示爲基於視圖模型綁定的內容展示器的內容,所以將使用數據觸發器....事件觸發器當您想根據用戶控件屬性顯示時使用r – Akanksha 2016-08-28 15:02:16

4

如果你想使用觸發器來顯示用戶控件,你應該使用ContentControl而不是ContentPresenter。 我更喜歡將ContentPresenter用於CustomControls,以及在我的系統中使用UserControl作爲自定義數據類型的視圖,並允許提供動態行爲。

例如:要切換模板ContentPresenter需要設置ContentTemplateSelector這樣

<ContentPresenter Content="{Binding MyContent}" 
          ContentTemplate="{Binding MyContentTemplate}" 
          ContentTemplateSelector="{Binding MyContentTemplateSelector}"/> 

爲myContent,MyContentTemplate & MyContentTemplateSelector是依賴屬性,可以隨時隨地可以使用它的實例中綁定。

閱讀:作爲

ContentPresenter的DataContext的被自動設置爲 值

Usage of ContentPresenter

What is the difference between ContentControl and ContentPresenter

在討論的綁定提到行不通的Content屬性,而ContentControl的DataCon文字不是。

綁定相對於DataContext屬性的值被解析。如果您在ContentPresenter上聲明綁定,則在設置其內容時,綁定將被重新評估。

ContentControl.Content屬性可根據您的要求在任何觸發器上更改。如果要使用它來更改ViewModel屬性的PropertyChanged事件,可以通過將DataTrigger與其中包含UserControl實例的DataTemplate綁定或使用該UserControl的靜態資源來使用DataTrigger。

<ContentControl> 
    <ContentControl.Style> 
     <Style TargetType="{x:Type ContentControl}"> 
      <Setter Value="{StaticResource UnSelectedDataTemplate}" Property="ContentTemplate" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=IsSelected}" Value="True"> 
        <Setter Value="{StaticResource SelectedDataTemplate}" Property="ContentTemplate" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentContro.Style> 
</ContentControl> 

閱讀How to use triggers for content template,更多的細節here

差異的DataTemplate和靜態資源範圍的DataTemplate創建模板的每一個應用的時候一個新的實例。 而StaticResource再次使用UserControl的同一個實例(靜態實例)。 您也可以使用EventTriggers來更改內容基礎控制事件,如MouseOver等。

替代方法
非常類似於上述與細微的差別。定義爲資源中的數據模板。觸發內容更改基本相同。

...在<x.Resources />標籤:

<DataTemplate x:Key="DesignerTemplate" DataType="{x:Type vm:SolutionViewModel}"> 
    <vw:SolutionDesignerView /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type vm:SolutionViewModel}"> 
    <ContentControl Content="{Binding }"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsLoaded}" Value="True"> 
         <Setter Property="ContentTemplate" Value="{StaticResource DesignerTemplate}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate> 

...然後:

<ContentControl Content="{Binding Solution}" /> 
+0

我已經提出了編碼解。你在這裏提供了一些很好的信息。我可以將樣本粘貼到答案中,並且可以編輯和修改。這將獎勵你的賞金,可能還有一些upvotes。 – IAbstract 2016-08-28 15:48:58

+0

當然,你可以添加它..我也加了一些信息..謝謝你的賞金 – Akanksha 2016-08-28 15:52:12

+0

賞金獎勵窗口24小時不會打開。 – IAbstract 2016-08-28 16:10:23