Программно связать ObservableCollection с ListBox - PullRequest
1 голос
/ 01 декабря 2011

Этот вопрос выглядит так: Программно привязка List к ListBox но что касается моего примера, ответы, приведенные в этом посте, не работают для меня! Во всяком случае, я просмотрел около 10/15 подобных сообщений, но ни один не работал

Вот мой код xaml:

<Grid>
    <ListBox Name="ListBoxx"/>
</Grid>

А вот код:

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ObservableCollection<string> MyCollection = new ObservableCollection<string>();

            Random random = new Random();
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += (sender, e) =>
            {
                MyCollection.Add(random.Next(0, 100).ToString());
            };
            aTimer.Interval = 500;
            aTimer.Enabled = true;

            Binding myBinding2 = new Binding();
            myBinding2.Source = this;
            myBinding2.Path = new PropertyPath("MyCollection");
            ListBoxx.SetBinding(ListBox.ItemsSourceProperty, myBinding);
        }
    }
}

Насколько я знаю, мой класс не должен наследоваться от INotifyPropertyChanged, потому что я использую ObservableCollection.

Я не хочу использовать {Binding} в коде xaml.

Я попробовал этот код:

ListBoxx.ItemsSource = MyCollection;

это "работает", но у меня произошел сбой потока. Я знаю, что могу использовать Dispatcher, чтобы исправить это, но это не исправляет мой код. Я хочу использовать «реальную» привязку (настраиваемую), как в моем фрагменте кода.

В результате я не получил ошибку, но ListBox просто не обновляется: /

Я пытался добавить строки:

MyCollection.Add("aaa");
MyCollection.Add("bbb");
MyCollection.Add("ccc");
MyCollection.Add("ddd");

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

Я тоже пытался получить MyCollection как свойство:

private ObservableCollection<string> _MyCollection = new ObservableCollection<string>();
public ObservableCollection<string> MyCollection { get { return _MyCollection; } }

но это тоже не работает: / (без ошибок, но без обновлений)

Ответы [ 2 ]

6 голосов
/ 01 декабря 2011

Код, который вы опубликовали, потерпит неудачу, потому что «MyCollection» не является свойством в MainWindow.Возможно, в окне вывода Visual Studio отображаются ошибки привязки.

Кроме того, вам действительно необходимо отправить изменения, которые вы вносите в коллекцию, для этого вы можете использовать DispatcherTimer.Об этом тоже должны быть ошибки в окне вывода.

Код ниже работает:

public partial class MainWindow : Window
{
    public ObservableCollection<string> MyCollection { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        MyCollection = new ObservableCollection<string>();

        Random random = new Random();
        DispatcherTimer aTimer = new DispatcherTimer();
        aTimer.Tick += (sender, e) =>
        {
            MyCollection.Add(random.Next(0, 100).ToString());
        };
        aTimer.Interval = new TimeSpan(0,0,0,0,500);
        aTimer.Start();

        Binding myBinding2 = new Binding();
        myBinding2.Source = this;
        myBinding2.Path = new PropertyPath("MyCollection");
        ListBoxx.SetBinding(ListBox.ItemsSourceProperty, myBinding2);
    }
}
2 голосов
/ 01 декабря 2011

Первый случай не может работать, поскольку привязки работают только со свойствами. Если вы создаете свойство, как показано в конце, оно должно работать, учитывая, что связанный объект DataContext или Binding.Source - это объект, содержащий свойство.

Получаете ли вы ошибок привязки ? Вы пытались отладить ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...