Как включить кнопки и отобразить их события в ListBox? - PullRequest
2 голосов
/ 30 ноября 2010

У меня есть принципиальный вопрос о том, как отображать динамический список в виде списка.Внутри списка элементы хранятся в панели стека.Внутри панели стека находится строка и кнопка.Если я нажму на эту кнопку, этот объект / элемент (и кнопка, и строка) будут удалены из списка.

1) Как создать новые кнопки на основе количества объектов в списке?
2) Как связать идею, что эта кнопка связана с этим элементом в списке?
3) Возможно ли это даже с привязкой?

Извините, я все еще новичок в WPF, но начинаючтобы увидеть, что он достаточно мощный.

Если вы также можете привести краткий / короткий пример или направить меня по ссылке, похожей на эту, это будет с благодарностью.Спасибо!:)

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Это простой пример того, как вы можете это сделать.Во-первых, исходный класс для ListBox.Простой класс, который реализует интерфейс INotifyPropertyChanged и одно строковое свойство.

public class MyClass : INotifyPropertyChanged
{
    public MyClass(string myString)
    {
        MyString = myString;
    }
    private string m_myString;
    public string MyString
    {
        get
        {
            return m_myString;
        }
        set
        {
            m_myString = value;
            OnPropertyChanged("MyString");
        }
    }

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

MainWindow имеет ObservableCollection MyClass.Мы устанавливаем DataContext для самого Window (this), это заставит ListBox наследовать DataContext, чтобы мы могли привязать его ItemsSource к MyClasses.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyClasses = new ObservableCollection<MyClass>();
        MyClasses.Add(new MyClass("My String 1"));
        MyClasses.Add(new MyClass("My String 2"));
        MyClasses.Add(new MyClass("My String 3"));
        this.DataContext = this;
    }

    public ObservableCollection<MyClass> MyClasses
    {
        get;
        private set;
    }
}

В xaml у нас есть ListBox, который привязывается к MyClasses.ItemTemplate для каждого ListBoxItem в ListBox, каждый элемент привязывается к своему экземпляру MyClass, представляет свойство MyString и кнопку «Удалить».DataContext для каждого ListBoxItem будет экземпляром MyClass.

<ListBox ItemsSource="{Binding MyClasses}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding MyString}" Margin="6"/>
                <Button Content="Remove"
                        Click="RemoveListBoxItem_Click"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Наконец, мы добавляем код позади EventHanlder для RemoveListBoxItem_Click в MainWindow.xaml.cs.

private void RemoveListBoxItem_Click(object sender, RoutedEventArgs e)
{
    // The clicked Button
    Button button = sender as Button;
    // The DataContext of the Button will be its instance of MyClass
    MyClass selectedItem = button.DataContext as MyClass;
    if (selectedItem != null)
    {
        // Remove the MyClass item from the collection
        MyClasses.Remove(selectedItem);
    }
}
0 голосов
/ 30 ноября 2010

Полагаю, вам нужно изменить шаблон элемента управления или шаблон содержимого элемента управления. Посмотрите на следующие ссылки http://mark -dot-net.blogspot.com / 2007/07 / creation-custom-wpf-button-template-in.html http://msdn.microsoft.com/en-us/magazine/cc163497.aspx

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...