DataTemplate для элемента ListBox не является обязательным

1

У меня есть элемент 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;
  • 0
    почему вы не определяете свои вещи в синтаксисе xaml?
  • 0
    @blindmeis Если есть способ сделать это, я бы тоже хотел это знать, пожалуйста. Тем не менее, я все еще хочу знать, как это сделать с C Sharp.
Теги:
wpf
listbox
datatemplate
datacontext

1 ответ

1
Лучший ответ

Мне не нравится определение кода для такой вещи, поэтому вот 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>
  • 0
    Спасибо, но я тоже пытался с этим, и это тоже не сработало. Я нуб, поэтому я, вероятно, делаю это неправильно, поэтому позвольте мне задать вам пару вопросов. С local я должен понимать псевдоним, который я даю в этом объявлении xmlns:local="clr-namespace:MyNamespace" ? Кроме того, мне все еще нужно добавить свойства DataContext & ItemsSource ? Если да, не могли бы вы дать мне краткое объяснение? Благодарю.
  • 0
    локальный означает пространство имен для вашего класса деятельности. и, конечно, DataTemplate просто работает, если вы зададите правильный DataContext и правильный источник ресурсов для вашего ListBox.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню