2009-12-21 3 views
0

Je voudrais être en mesure de créer un DataTemplate à utiliser quand une collection est transmise à un contrôle.Comment créer un DataTemplate pour une collection?

Je suis en train de construire un contrôle unique, qui, lorsqu'il est passé à un objet, ou à une collection d'objets, la vue du contrôle utilisateur est conforme au modèle défini pour le type d'objet.

Par exemple, il s'agit d'un contrôle utilisateur que j'ai, qui bascule les vues lorsqu'un objet est transmis dans la propriété .Content.

<UserControl x:Class="Russound.Windows.UI.UserControls.MAX.OMS_Main_Screen.OMSContextSwitcher" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:Entities="clr-namespace:Russound.Components.ReturnAuthorization.Entities;assembly=Russound.Components" 
      xmlns:Return_Authorization="clr-namespace:Russound.Windows.UI.UserControls.Return_Authorization" 
      xmlns:CallLog="clr-namespace:Russound.Windows.UI.UserControls.CallLog" 
      xmlns:Entities1="clr-namespace:Russound.Components.Membership.Entities;assembly=Russound.Components" 
      xmlns:Membership="clr-namespace:Russound.Windows.UI.UserControls.Membership" 
      xmlns:Entities2="clr-namespace:Russound.Components.Commerce.MAX.Entities;assembly=Russound.Components" 
      xmlns:OMS_Main_Screen="clr-namespace:Russound.Windows.UI.UserControls.MAX.OMS_Main_Screen" 
      xmlns:Entities3="clr-namespace:Russound.Components.CallLog.Entities;assembly=Russound.Components" 
      MinHeight="600" MinWidth="700"> 

    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/Russound.Windows;component/UI/RussoundDictionary.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 

       <DataTemplate DataType="{x:Type Entities3:Case}" > 
        <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" /> 
       </DataTemplate> 

       <DataTemplate DataType="{x:Type Entities:RAMaster}"> 
        <Return_Authorization:RaMasterUi DataContext="{Binding}" /> 
       </DataTemplate> 

       <DataTemplate DataType="{x:Type Entities1:RussUser}"> 
        <Membership:CMCControlWpf DataContext="{Binding}" /> 
       </DataTemplate > 

       <DataTemplate DataType="{x:Type Entities2:MaxCustomer}"> 
        <OMS_Main_Screen:MaxCustomerConfigWpf DataContext="{Binding}" /> 
       </DataTemplate > 


     </ResourceDictionary> 
    </UserControl.Resources> 
</UserControl> 

Je voudrais pouvoir faire quelque chose comme:

<DataTemplate DataType="{x:Type IEnumerable<MaxCustomer>}"> 
    <OMS_Main_Screen:MaxCustomerConfigWpf DataContext="{Binding}" /> 
</DataTemplate > 

mais je reçois toujours une erreur de compilation, donc je suis à peu d'une perte.

Répondre

3

Vous pouvez créer une collection typée et utiliser ce type au lieu de IEnumerable directement

public class MyCollection:IEnumerable<MaxCustomer> 
{ 
    .... 
} 

<DataTemplate DataType="{x:Type Entities:MyCollection}"> 
      <OMS_Main_Screen:MaxCustomerConfigWpf DataContext="{Binding}" /> 
</DataTemplate > 
+2

+1, et la raison pour laquelle vous ne pouvez pas faire ce que l'OP voulait est parce que WPF ne permet pas templating sur les interfaces. – user7116

+0

Oui, c'est où je me suis penché. Je me demandais simplement s'il y avait une autre méthode d'attaque ici. – Russ

Questions connexes