Я хочу добавлять в лист сразу псевдоформу, пример на картинке, соответственно чтобы с ней можно было работать, взаимодействовать с кнопками, предоставляется ли это возможным? Вернее не так, иожно ли создать такой объект (псевдоформу), чтобы потом, просто создавая экземпляр данной формы добавлять его к пример в listView. 
- 31
- 2
-
Научитесь делать привязки, у вас не должно быть никаких "псевдоформ" в коде, а просто класс, содержащий в себе нужные данные, а уже XAML определяет дизайн для нужного класса. – EvgeniyZ Jul 07 '20 at 09:48
1 Answers
Используйте 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>
Привязка – это просто копирование или создание ссылки на другие определённые данные. Значение привязывается ещё до отрисовки и обработки ввода (и даже раньше событий загрузки) (ссылка).
- 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