rameshKumar1717 Ответов: 2

Как полностью привязать listbox через XAML.


Привет после долгого времени, когда я начал работать в wpf, я борюсь с заполнением списка через полную привязку XAML ниже приведен мой код.

Вот моя коллекция класс

<pre>namespace WPFInterview
{
    public class Collection
    {
        public  IEnumerable<Person> _collection{get; set;}
        public Collection()
        { 
         FillObservableCollection();
        }

        private void FillObservableCollection()
        {
            _collection = new ObservableCollection<Person> { new Person { Name = "Ram", Age = 10 }, new Person { Name = "Shyam", Age = 11 }, new Person { Name = "Raju", Age = 13 } };
            
            // lstMy.ItemsSource = _collection;      
        }

        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }

        }
     
    }
}


Вот мой XAML код с привязкой

<Window x:Class="WPFInterview.BindingElement"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
        xmlns:local="clr-namespace:WPFInterview"     
        Title="BindingElement" Height="300" Width="300">
    <Window.DataContext>
        <local:Collection/>
    </Window.DataContext>
    <Canvas>
        <ListBox Name="lstMy" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100" Canvas.Left="67" Canvas.Top="65" ItemsSource="{Binding _collection}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Name}"/>
                        <TextBlock Text="{Binding Age}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Canvas>
</Window>


Я не в состоянии poupulate listbox

Что я уже пробовал:

Да, я пытался, но не смог заселить.

[no name]

Вам нужно реализовать INotifyPropertyChanged

rameshKumar1717

Вышеописанное решение тоже работает, как я понял позже.

2 Ответов

Рейтинг:
20

#realJSOP

Ваша коллекция должна наследовать от ObservableCollection:

public ObservableCollection<MyObject> MyCollection { get; set; };

public MainWindow()
{
    this.InitializeComponents();
    this.DataContext = this;
    this.MyCollection = new ObservableCollection<MyObject>();
}


Затем в вашем XAML вы можете установить ItemsSource="{Binding Path=MyCollection}".


ridoy

а 5.

Рейтинг:
2

Wendelius

Ну, на самом деле это заполняет как коллекцию, так и список, даже во время разработки.

Немного более простая форма

<Window x:Class="WindowNameSpace.Window3"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:SomeLocalNamespace"

        mc:Ignorable="d"

        Title="Window3" Height="300" Width="300">
    <Window.DataContext>
        <local:Collection/>
    </Window.DataContext>
    <Grid>
        <ListBox ItemsSource="{Binding _collection}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}"/>
                        <TextBlock Text="{Binding Age}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

А класс
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace SomeLocalNamespace {
   public class Collection {
      public IEnumerable<Person> _collection { get; set; }
      public Collection() {
         FillObservableCollection();
      }
      private void FillObservableCollection() {
         _collection = new ObservableCollection<Person> {
            new Person { Name = "Ram", Age = 10 },
            new Person { Name = "Shyam", Age = 11 },
            new Person { Name = "Raju", Age = 13 }
         };

      }
      public class Person {
         public string Name { get; set; }
         public int Age { get; set; }

      }
   }
}

Если вы откроете форму во время разработки или во время выполнения, вы увидите три строки, содержащие имена и возраст.

Причина в том, что вы определили класс в контексте данных окна. Затем WPF снова создает экземпляры этих объектов при использовании, так что это фактически приводит к созданию коллекции.

Затем вы снова заполняете коллекцию в конструкторе, а привязка в списке ссылается на коллекцию, которую вы только что заполнили, так что все работает.

Однако, как отметил Джон Симмонс, вы должны использовать наблюдаемую коллекцию, чтобы элемент пользовательского интерфейса реагировал на изменения в коллекции. Это также означает, что класс должен реализовать INotifyPropertyChanged.


ridoy

а 5.

Wendelius

Спасибо.