我有一個xaml頁面,它上面有一個ItemsControl控件。 ItemsControl綁定到ObservableCollection的Guests。客人收藏品可以具有兩種不同類型的物品:USGuest和UKGuest,均從客人繼承。是否有可能爲ItemsControl製作兩個(或更多)模板,並根據集合中當前項目的運行時類型自動選擇它們?如何使ItemsControl根據運行時類型選擇不同的模板
回答
對不起,我不是故意要掃大家的興,而不是提供一個解決方案。但這是我在Silverlight中使用MVVM時遇到的最大障礙之一。
我在過去做過的一件事就是使用一個帶有ContentPresenter的UserControl作爲ItemsTemplate。 (如此多的圖層!)在UserControl中,當DataContext發生變化時,我會從UserControl的資源中選擇一個模板來使用。 (模板不會真的必須是用戶控件裏面,但我喜歡這樣的封裝最好的。)
的MainPage:
<UserControl>
<UserControl.Resources>
<DataTemplate x:key="itemTemplate">
<my:ItemView />
</DataTemplate>
</UserControl.Resources>
<ItemsControl ItemTemplate="{StaticResource itemTemplate}" />
</UserControl>
ItemView.xaml:
<UserControl>
<UserControl.Resources>
<DataTemplate x:Key="Template1">
<!-- Template #1 -->
</DataTemplate>
<DataTemplate x:Key="Template2">
<!-- Template #2 -->
</DataTemplate>
</UserControl.Resources>
<ContentPresenter Name="presenter"
Content="{Binding}" />
</UserControl>
ItemView.xaml.cs
...
OnDataContextChanged(...)
{
var content = this.DataContext as MyDataType;
DataTemplate template;
switch (content.State)
{
case State1:
template = this.Resources["template1"] as DataTemplate;
break;
case State2:
template = this.Resources["template2"] as DataTemplate;
break;
}
this.presenter.ContentTemplate = template;
}
...
如果您仍在繼續,請注意Silverlight也不提供像在WPF中獲得的OnDataContextChanged方法。因此,要覆蓋,看看有什麼傑里米Likness在這裏說一下:
http://www.codeproject.com/Articles/38559/Silverlight-DataContext-Changed-Event.aspx
我用那個漂亮頻繁。謝謝,傑里米!
此外,與WPF在該領域爲您提供的所有功能相比,還存在一些非常嚴格的限制。例如,真的沒有什麼好辦法僞造一個ItemContainerStyle選擇器。 (我知道的。)
我還沒有嘗試過這個,但是您是否嘗試將ItemsSource設置爲Guest對象的ObservableCollection併爲這兩種類型設置DataTemplate?
<DataTemplate DataType="{x:Type my:USGuestViewModel}">
<my:USGuestView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:UKGuestViewModel}">
<my:UKGuestView/>
</DataTemplate>
編輯:「我」是你的ViewModels和視圖生活的命名空間的聲明,所以你應該在XAML的beggining添加如下內容:
<UserControl x:Class="my.namespace.SuperView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:my.namespace">
我檢查並且您無法在ItemTemplate屬性中設置兩個DataTemplates。但是你可以將它們設置在你的用戶控件資源屬性:
<UserControl.Resources>
<DataTemplate DataType="{x:Type my:USGuestViewModel}">
<my:USGuestView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:UKGuestViewModel}">
<my:UKGuestView/>
</DataTemplate>
</UserControl.Resources>
+1,這可能是最好的方式。只需將這些模板放置在ItemsControl的資源中 – 2010-06-28 14:07:06
我在ItemControl的資源中添加了模板,並且出現構建錯誤「成員」DataType「無法識別或訪問」。我提到我正在開發Silverlight 4項目嗎?這一切都可以在Silverlight中實現嗎? – durad 2010-06-28 14:19:35
我認爲它雖然有一些方法不存在於Silverlight中。我不認爲是這樣。我將使用更完整的代碼編輯帖子代碼片段 – jpsstavares 2010-06-28 15:05:43
- 1. 根據ViewModel類型爲ItemsControl選擇DataTemplate
- 2. 在運行時選擇基類類型,如模板
- 3. 根據設備類型選擇不同的故事板
- 4. 使用InstantSearch.js在運行時選擇不同的模板
- 5. 如何根據運行時數據在Dynamic Data中選擇DynamicField模板?
- 6. 如何根據模板參數返回不同類型
- 7. shell腳本,如何根據選擇運行不同的代碼?
- 8. 如何根據屬性的運行時類型動態選擇驗證器?
- 9. 如何根據其類型爲模型的每個不同的子類分配不同的模板
- 10. 爲什麼不根據其對象的運行時類型選擇此方法?
- 11. 根據模板參數選擇成員類型?
- 12. 不同的標籤根據內容類型使用不同的模板文件?
- 13. 根據列選擇不同的行
- 14. 根據列值選擇不同的行
- 15. 在運行時獲取模板類型
- 16. 如何根據不同的列數據進行選擇
- 17. 如何選擇和使用不同數據類型的功能?
- 18. 如何根據租戶選擇運行時的彈簧配置?
- 19. ItemsControl基於內容的不同模板
- 20. 根據WHERE選擇不同
- 21. 根據模板參數包裝類型容器的模板類
- 22. 如何使用不同類型的XSLT模板(「基於模塊」)?
- 23. 根據用戶選擇存儲和驗證不同類型
- 24. 如何根據A COLUMN的不同值選擇行
- 25. SQL - 如何根據不同表中的值選擇行?
- 26. MySQL查詢:如何根據時間選擇不同的
- 27. 模板類型推演:不同的模板類型
- 28. 如何計算在運行時選擇的類型「對象」
- 29. 運行時差異使用不同數據類型的C++
- 30. 如何根據對象的值爲組合框選擇模板
等一下,你問的是在Silverlight中這樣做的,對吧? – MojoFilter 2010-07-06 14:26:16