0

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

  • Научитесь делать привязки, у вас не должно быть никаких "псевдоформ" в коде, а просто класс, содержащий в себе нужные данные, а уже XAML определяет дизайн для нужного класса. – EvgeniyZ Jul 07 '20 at 09:48

1 Answers1

2

Используйте 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&lt;Item&gt; Items { get; }
public Item? SelectedItem // вообще нужно через `SelectedItemIndex`, но тоже работает
{
    get =&gt; selItem;
    set
    {
        selItem = value;

        OnPropertyChanged(&quot;SelectedItem&quot;);
    }
}

public event PropertyChangedEventHandler? PropertyChanged;

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

protected virtual void OnPropertyChanged(string propertyName) =&gt;
    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>

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

return
  • 2,740
  • По поводу ответа есть пару замечаний: 1. Для отображения уникальных данных - как ваш пример даст разный вид отображения для разных объектов в коллекции? Чтобы было разное отображение, надо установить дополнительно DateType у DataTemplate и делать их несколько, с разным дизайном под каждый тип. Это я думаю стоит уточнить, что бы у человека не было вопросов. 2. Наверно стоит показать как привязать коллекцию, я на 100% уверен, что автор вопроса совершенно не знает как работает WPF и если он изначально увидит "эталонный" вариант, то дальше будет действовать по нему. – EvgeniyZ Jul 07 '20 at 10:32
  • DataContect в XAML, это нарушение MVVM, раз уж решили по правилам MVVM (что я не просил), то тогда наверно стоит делать это правильно, или сделать пометку почему так не стоит делать. – EvgeniyZ Jul 07 '20 at 10:54