2010-06-28 25 views
1

我有一個xaml頁面,它上面有一個ItemsControl控件。 ItemsControl綁定到ObservableCollection的Guests。客人收藏品可以具有兩種不同類型的物品:USGuest和UKGuest,均從客人繼承。是否有可能爲ItemsControl製作兩個(或更多)模板,並根據集合中當前項目的運行時類型自動選擇它們?如何使ItemsControl根據運行時類型選擇不同的模板

+0

等一下,你問的是在Silverlight中這樣做的,對吧? – MojoFilter 2010-07-06 14:26:16

回答

2

對不起,我不是故意要掃大家的興,而不是提供一個解決方案。但這是我在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選擇器。 (我知道的。)

7

我還沒有嘗試過這個,但是您是否嘗試將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

+1,這可能是最好的方式。只需將這些模板放置在ItemsControl的資源中 – 2010-06-28 14:07:06

+0

我在ItemControl的資源中添加了模板,並且出現構建錯誤「成員」DataType「無法識別或訪問」。我提到我正在開發Silverlight 4項目嗎?這一切都可以在Silverlight中實現嗎? – durad 2010-06-28 14:19:35

+0

我認爲它雖然有一些方法不存在於Silverlight中。我不認爲是這樣。我將使用更完整的代碼編輯帖子代碼片段 – jpsstavares 2010-06-28 15:05:43

相關問題