Вопрос по wpf c#

Я хочу добавлять в лист сразу псевдоформу, пример на картинке, соответственно чтобы с ней можно было работать, взаимодействовать с кнопками, предоставляется ли это возможным? Вернее не так, иожно ли создать такой объект (псевдоформу), чтобы потом, просто создавая экземпляр данной формы добавлять его к пример в listView. состоящую из текстовой ячейки и двух кнопок


Ответы (1 шт):

Автор решения: return

Используйте DataTemplate в ListBox:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="ваш тип для предмета">
            <!--ваша XAML разметка для каждого элемента-->
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Для отображения уникальных данных (отн. каждого элемента) можно использовать привязки:

...
<ListBox ItemSource="..." SelectedItem="..." SelectedItemIndex="...">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="Item">
            <TextBlock Text="{Binding Text}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

…где ItemsSource имеет значение след. типа:

ObservableCollection<Item>

…где Item – это:

public class Item
{
    public string Text { get; set; }
}

В WPF нет ограничений на содержимое контролов – всё, что можно отобразить; т. е. вы можете запихнуть туда Grid, а в него уже ваш text с b1 и b2.


Подробнее о ItemTemplate и DataTemplate можно узнать здесь.


Сейчас все нормальные [обычные] приложения WPF используют паттерн MVVM. По ссылке прочитаете всю инфу, вот реализация:

MainViewModel.cs

public class MainViewModel : INotifyPropertyChanged
{
    Item? selItem;

    public ObservableCollection<Item> Items { get; }
    public Item? SelectedItem // вообще нужно через `SelectedItemIndex`, но тоже работает
    {
        get => selItem;
        set
        {
            selItem = value;

            OnPropertyChanged("SelectedItem");
        }
    }

    public event PropertyChangedEventHandler? PropertyChanged;

    public MainViewModel()
    {
        Items = new ObservableCollection<Item>();
        SelectedItem = null; // нет выделения // убрать: строчка чисто для разяснения
    }

    protected virtual void OnPropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(this, propertyNa,e);
}

MainWindow.xaml.cs

MainViewModel vm;

public MainWindow()
{
    vm = new MainViewModel();
    DataContext = vm;
}

MainWindow.xaml

<Window ...>
    <Grid>
        <ListBox ItemSource="{Binding Items}" SelectedItem="{SelectedItem}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="Item">
                    <TextBlock Text="{Binding Text}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

Привязка – это просто копирование или создание ссылки на другие определённые данные. Значение привязывается ещё до отрисовки и обработки ввода (и даже раньше событий загрузки) (ссылка).

→ Ссылка