既然你要根據綁定的值更改模板,你可以使用一個DataTrigger
確定的ListBoxItem
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}"/>
<Style.Triggers>
<DataTrigger Property="{Binding SomeProperty}" Value="A">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateA}"/>
</DataTrigger>
</Style.Triggers>
</Style>
我找到ContentTemplate
這比使用DataTemplateSelector
,因爲它得到重新評估,如果更好綁定屬性會發生變化,而DataTemplateSelector
不會。
如果要根據對象類型更改模板,可以使用隱式DataTemplates
。這些是DataTemplates
,它們定義了DataType
,但沒有x:Key
,它們將在WPF嘗試繪製指定類型的對象時隨時使用。
例如,如果您曾在定義這個模板您<X.Resources>
地方
<DataTemplate DataType="{x:Type models:ActionA}">
<views:ActionAView />
</DataTemplate>
,那麼你可以直接插入你的模型對象到用戶界面和WPF將使用指定
<ContentControl Content="{Binding SomeIActionObject}" />
<ItemsControl ItemsSource="{Binding CollectionOfIActionObjects}" />
模板繪製
更新
您提到您將允許用戶創建與開始使用MEF導入其他模板模塊,所以在這種情況下,你可能會更好使用的IValueConverter是查找中Application.Resources
例如匹配的模板,如果綁定的值等於"A"
,那麼轉換器可能搜索Application.Resources
名爲"TemplateA"
模板,並將其返回結合
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate"
Value="{Binding SomeProperty,
Converter={StaticResource MyTemplateConverter}}"/>
</Style>
你還好嗎使用一些其他輔助類或類似的 - 只要你查看視圖模型只是一個 - 和單一屬性 - 或多個屬性在您的虛擬機中。有很多解決方案,稍後我會嘗試寫點東西 - 我只需要知道目標是什麼。例如。看到這個'flags'解決方案(解決方案2)http://stackoverflow.com/questions/15550344/genrating-views-usercontrols-using-contentcontrol/15550477#15550477 - (你可以映射這不僅僅是兩個'選擇等) - 但是我經常使用更好的方法。 – NSGaga 2013-03-26 18:59:21
我沒有使用助手/轉換器/等問題。我可以使用一個解決方案,它要求我在設計時在xaml中列出所有可能的選擇,因爲那時我不會知道它們。我想最簡單的方法來演示我需要的是爲DataTemplate添加一個假設屬性,如下所示:' '其中View是ListBox的DataTemplate中的一個屬性。 –
2013-03-26 19:05:59
可能是一個包含視圖名稱的字符串。我認爲,我可以安排所有的觀點都在同一個命名空間,即使是動態的。而上面我的意思是「ListBox的DataContext」,但我剛用完編輯時間 – 2013-03-26 19:10:34