2010-02-08 4 views
2

J'ai fait pas mal de WPF il y a quelques années mais j'ai tout oublié. Supposons que je possède une classe d'entreprise simple, disons un poste de travail TFS.Liaison d'une classe business simple à un WPF UserControl

public class WorkItem 
{ 
    public WorkItem(string name, DateTime date) 
    { 
     Name = name; 
     Date = date; 
    } 

    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

Ensuite, j'ai une liste de WorkItems, peut-être quelque chose comme ça.

class WiList : ObservableCollection<WorkItem> 
{ 
    public WiList() : base() 
    { 
     Add(new WorkItem("1", DateTime.Now)); 
     Add(new WorkItem("2", DateTime.Now)); 
    } 
} 

Ensuite, j'ai un UserControl qui représente un WorkItem, quelque chose comme ça.

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Class="WrapPanelItemsControlTest.WorkItemControl" 
    x:Name="UserControl" 
    d:DesignWidth="640" d:DesignHeight="480" HorizontalAlignment="Left" 
    VerticalAlignment="Top" Width="72" Height="40"> 

<StackPanel x:Name="LayoutRoot"> 
    <TextBlock x:Name="Name"/> 
    <TextBlock x:Name="Date"/> 
</StackPanel> 

La fenêtre principale contient un WrapPanel pour maintenir les UserControls. Ma question est, comment puis-je créer un WrapPanel qui se lie à WiList et affiche les WorkItems? Je me souviens avoir fait quelque chose comme ça avant, mais pour la mort de moi, je ne me souviens pas comment (probablement quelque chose du blog de Bea Costa). Bien sûr, je ne peux pas trouver mon ancien code de test n'importe où et semble être expectoralement mauvais à googler pour des exemples.

Toute aide est appréciée.

Répondre

0

Vous devez d'abord lier une instance de votre classe WiList à ItemSource d'ItemsControl, puis appliquer un DataTemplate à votre WorkItem.

Il y a un fil similaire here. Vous pouvez en savoir plus sur ItemsPanel ItemsPanel here.

2

Vous devez probablement utiliser ItemsControl pour cela. WrapPanel peut être utilisé comme panneau de disposition pour les éléments de la collection. Et si vous avez seulement besoin de UserControl pour montrer les propriétés d'un objet, alors le meilleur choix serait d'utiliser un DataTemplate. Voici quelques XAML:

<Window.Resources> 

    <DataTemplate x:Key="WorkItemTemplate" DataType="{x:Type local:WorkItem}"> 
     <StackPanel> 
      <TextBlock Text="{Binding Name}"/> 
      <TextBlock Text="{Binding Date}"/> 
     </StackPanel> 
    </DataTemplate> 

</Window.Resources> 

<Grid> 

    <ItemsControl 
     x:Name="itemsList" 
     ItemTemplate="{StaticResource WorkItemTemplate}" 
     > 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

</Grid> 

Et lier code derrière le ItemsControl à la collection:

itemsList.ItemsSource = new WIList(); // or wherever the collection comes from 

post-scriptum L'initialisation de ItemsSource et l'accès général aux commandes à partir de code-behind pour les lier à des données n'est pas une bonne pratique. Vous auriez besoin d'une classe ViewModel (Presenter) en tant que DataContext de votre fenêtre. Si vous envisagez de rester avec un certain temps avec WPF, mon conseil est - essayez d'utiliser MVVM.

P.P.S. N'oubliez pas d'implémenter INotifyPropertyChanged sur WorkItem si vous avez besoin de WPF pour suivre les changements de valeurs des propriétés.

+0

Initialiser ItemsSource _de code-behind_ n'est pas une bonne pratique. Vous avez probablement voulu dire cela, mais cela peut ne pas être clair pour le P.S. +1 =) –

+0

merci! bien sûr, j'ai laissé tomber ces mots, je vais me corriger – arconaut