У меня есть элемент ListBox
,
целью которого является показать пользователям действия,
которые зарегистрированы в базе данных
чтобы они могли выбирать из них, чтобы изменить или удалить их.
После рассмотрения двух очень полезных ответов об использовании DataContext и DataTemplates,
Я решил реализовать эти знания в своем проекте,
к сожалению, он не работает.
Когда я запускаю его, и я выбираю текст в ListBox
,
Я вижу только: DataTemplate templ = new DataTemplate(typeof(Activities));
как его содержание, и я не отмечал его как код,
потому что я хочу подчеркнуть тот факт, что он выглядит как string
,
если вы будете.
Я понимаю, что может быть более одного обходного пути для того, чего я пытаюсь достичь.
однако я действительно хочу это понять, поскольку он представляется очень полезным.
Здесь код:
//This is the connection instance to the database
Connection c = new Connection();
DataTemplate templ = new DataTemplate(
typeof(Activities)
);
//The ListActivities method returns
//an ObservableCollection<Activities> list
libTest.DataContext = c.ListActivities(
objSem.getId()
);
libTest.SetBinding(
ItemsControl.ItemsSourceProperty, new Binding()
);
FrameworkElementFactory sp = new FrameworkElementFactory(
typeof(StackPanel)
);
sp.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
sp.Name = "myTemplate";
FrameworkElementFactory date = new FrameworkElementFactory(
typeof(Label)
);
date.SetBinding(Label.ContentProperty, new Binding("date"));
sp.AppendChild(date);
FrameworkElementFactory nameAct = new FrameworkElementFactory(
typeof(Label)
);
nameAct.SetBinding(Label.ContentProperty, new Binding("nameAct"));
sp.AppendChild(nameAct);
FrameworkElementFactory descr = new FrameworkElementFactory(
typeof(Label)
);
descr.SetBinding(Label.ContentProperty, new Binding("descr"));
sp.AppendChild(descr);
FrameworkElementFactory quantity = new FrameworkElementFactory(typeof(Label));
quantity.SetBinding(Label.ContentProperty, new Binding("quantity"));
sp.AppendChild(quantity);
templ.VisualTree = sp;
libTest.ItemTemplate = templ;
Мне не нравится определение кода для такой вещи, поэтому вот xaml one
<DataTemplate DataType="{x:Type local:Activities}">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding date}"/>
<Label Content="{Binding nameAct}"/>
<Label Content="{Binding descr}"/>
<Label Content="{Binding quantity}"/>
</StackPanel>
</DataTemplate>
просто поместите это в свои ресурсы, и все действия будут отображаться как это
PLS читать что-то больше о привязке в WPF, возможно, MVVM. поэтому вам лучше понять, что вам нужно, когда вы привязываетесь к WPF.
небольшой пример
создайте класс, который будет вашим DataContext, и поставьте для него публичное свойство для своего списка.
public class SampleViewModel
{
public ObservableCollection<Activities> MyActivities {get;set;}
}
xaml.cs: установите DataContext для вашего представления в класс Viewmodel
public partial class SampleWindow : Window
{
private SampleViewModel _data;
public SampleWindow()
{
_data = new SampleViewModel();
InitializeComponent();
this.DataContext = _data;
}
}
xaml: укажите свои привязки для своих элементов управления
<ListBox ItemsSource="{Binding MyActivities}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding date}"/>
<Label Content="{Binding nameAct}"/>
<Label Content="{Binding descr}"/>
<Label Content="{Binding quantity}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
или
<ListBox ItemsSource="{Binding MyActivities}">
<ListBox.Resources>
<DataTemplate DataType="{x:Type local:Activities}">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding date}"/>
<Label Content="{Binding nameAct}"/>
<Label Content="{Binding descr}"/>
<Label Content="{Binding quantity}"/>
</StackPanel>
</DataTemplate>
</ListBox.Resources>
</ListBox>
local
я должен понимать псевдоним, который я даю в этом объявлении xmlns:local="clr-namespace:MyNamespace"
? Кроме того, мне все еще нужно добавить свойства DataContext
& ItemsSource
? Если да, не могли бы вы дать мне краткое объяснение? Благодарю.