如果你想使用觸發器來顯示用戶控件,你應該使用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}" />
這是不對的。 UserControl上的觸發器必須是EventTrigger類型的。 – Joe 2013-07-24 21:20:59
@Joe:對於正確答案的任何想法? – IAbstract 2016-08-28 13:46:54
@IAbstract綁定fr用戶控件不能通過給定類型來完成......需要聲明一個靜態資源fr用戶控件實例,然後綁定,因爲內容將起作用。 喬 - 因爲此用戶控件正在顯示爲基於視圖模型綁定的內容展示器的內容,所以將使用數據觸發器....事件觸發器當您想根據用戶控件屬性顯示時使用r – Akanksha 2016-08-28 15:02:16