2010-08-19 4 views
0

Je suis encore un peu nouveau à WPF (seulement quelques petits projets avec). J'essaye de faire un groupe répétitif de contrôles (l'utilisateur peut ajouter/enlever ces groupes), databound à une classe faite sur commande. Exemple UI:WPF Liste des groupes de contrôles Databound à List of Custom Class?

([UserButton1] [UserButton2]) <--each of these() is a separate group of buttons 
([Cheese]  [Wine]  ) 
([Wallace]  [Gromit] ) 
         [Add] <--this button can add more groups 

databound à une liste d'une classe comme celui-ci (pseudocode):

class UserButtons { 
    string UserButton1 = "UserButton1" 
    string UserButton2 = "UserButton2" 
} 

tels que

List<UserButtons> = { 
    [0]: UserButton1, UserButton2 
    [1]: Cheese, Wine 
    [2]: Wallace, Gromit 
} 

Je sais que c'est le genre de chose WPF a été créé à faire, mais je n'arrive pas à comprendre exactement comment s'y prendre.

Devrais-je utiliser une sorte de ListView? Un DataTemplate pourrait-il aider? Un StackPanel sonne bien, mais il n'a pas de liaison de données pour une liste ... ou le fait-il? Et je ne suis même pas sûr de savoir comment faire la liaison de données pour les groupes de boutons comme indiqué ci-dessus (si cela avait même du sens pour vous ... désolé pour le mauvais exemple). Quelqu'un a-t-il un aperçu de ce problème?

J'ai cherché pour essayer de trouver une question se rapportant à ceci et n'ai pas vu un, peut-être parce que je ne savais pas quoi chercher. Donc, désolé si c'est un dupe involontaire.

Répondre

4

Je ne suis pas entièrement sûr de ce que vous cherchez mais j'espère que l'exemple ci-dessous vous aidera. J'ai utilisé un ItemsControl dont ItemsSource est défini sur la collection de UserButtons. Sa propriété ItemTemplate est définie sur un StackPanel qui affiche deux boutons, la propriété Content de chaque est liée aux propriétés dans UserButtons.

XAML:

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication3" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 

    </Window.Resources> 

    <StackPanel Orientation="Vertical"> 
     <ItemsControl x:Name="itemsControl" Background="LightBlue"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Button Content="{Binding Button1}" Width="100"/> 
         <Button Content="{Binding Button2}" Width="100"/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

     <Button Width="50" Click="Button_Click">Add</Button> 

    </StackPanel> 

</Window> 

code-behind:

public partial class MainWindow : Window 
{ 
    ObservableCollection<UserButtons> oc; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     oc = new ObservableCollection<UserButtons>() 
     { 
      new UserButtons() { Button1="UserButton1", Button2 = "UserButton2"}, 
      new UserButtons() { Button1="Cheese", Button2 = "Wine"}, 
      new UserButtons() { Button1="Wallace", Button2 = "Gromit"}, 
     }; 

     this.itemsControl.ItemsSource = oc; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     oc.Add(new UserButtons() { Button1 = "NewButton1", Button2 = "NewButton2" }); 
    } 
} 

public class UserButtons : INotifyPropertyChanged 
{ 
    private string button1; 
    public string Button1 
    { 
     get { return this.button1; } 
     set 
     { 
      this.button1 = value; 
      this.OnPropertyChanged("Button1"); 
     } 
    } 

    private string button2; 
    public string Button2 
    { 
     get { return this.button2; } 
     set 
     { 
      this.button2 = value; 
      this.OnPropertyChanged("Button2"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 

    #endregion 
} 
+0

Merci beaucoup! Vous avez parfaitement compris ma question mal expliquée et m'a indiqué la bonne direction. Merci! – NickAldwin

+0

Pas de problème. Heureux de vous aider. =) – ASanch

Questions connexes