WPF Список групп элементов управления, привязанных к списку пользовательских классов - PullRequest
0 голосов
/ 19 августа 2010

Я все еще новичок в WPF (только несколько небольших проектов).Я пытаюсь создать повторяющуюся группу элементов управления (пользователь может добавлять / удалять эти группы), привязанную к пользовательскому классу.Пример пользовательского интерфейса:

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

привязан к списку таких классов (псевдокод):

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

, таких как

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

Я знаю, что этоWPF был создан для этого, но я не могу точно понять, как это сделать.

Должен ли я использовать какой-то ListView?Поможет ли DataTemplate?StackPanel звучит нормально, но у него нет привязки данных для списка ... или нет?И я даже не уверен, как заставить привязку данных работать для групп кнопок, как указано выше (если это даже имело смысл для вас ... извините за плохой пример).У кого-нибудь есть понимание этой проблемы?

Я искал, чтобы попытаться найти вопрос, относящийся к этому, и не видел ни одного, возможно, потому что я не был уверен, что искать.Так что извините, если это непреднамеренный обман.

1 Ответ

4 голосов
/ 20 августа 2010

Я не совсем уверен, что вы ищете, но я надеюсь, что приведенный ниже пример поможет.Я использовал ItemsControl, у которого ItemsSource установлен набор UserButtons.Его свойство ItemTemplate установлено в StackPanel, в котором отображаются две кнопки, свойство Content каждой из которых связано со свойствами в 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
}
...