WPF ListBox绑定未显示

时间:2016-11-15 23:01:18

标签: c# wpf xaml data-binding listbox

我是WPF的新手,并且在将数据绑定到简单的ListBox时遇到了问题。我在MainWindow.XAML

中进行了设置
<ListBox Name="lbxShows" />

然后在后面的代码中,我将ItemsSource属性设置为Show对象的Show对象的ObservableCollection。这实际上是另一个类(Oasis)的属性,其中OasisInst是一个实例(在MainApplication的构造函数中设置)。

InitializeComponent();
mainApp = new MainApplication();
lbxShows.ItemsSource = mainApp.OasisInst.ShowList;

此时,ShowList中没有项目,但后来有些项目被添加,并且它们不会出现在ListBox中。

Oasis类的代码实现了INotifyPropertyChanged接口,然后具有从ShowList setter调用的textbook方法。

private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

PropertyChanged是我的PropertyChangedEventHandler事件。

当我在调试模式中单步执行时,PropertyChanged为null,因此似乎没有订阅我的事件。鉴于这通常会通过绑定自动发生(我认为?),那么我猜测绑定尚未正确设置。

也许单独设置ItemsSource属性不足以设置绑定?

2 个答案:

答案 0 :(得分:0)

您正在做的事情应该足以绑定ObservableCollection并让U / I接收更新。 我认为不是这样建议使用BindingObject但发现它有效。 (所以我也学到了一些东西)。 这是一个应该与您提供的Xaml一起使用的简单示例。它每秒在列表中添加一个条目。

我很困惑你提到的地方&#34; PropertyChanged是我的PropertyChangedEventHandler事件。&#34;请注意,唯一需要的PropertyChangedEventHandler位于Oasis对象中。

也许你的意思是你的U / I上有其他控件需要MainWindow上的PropertyChangedEventHandler但是它不应该与Oasis对象中的PropertyChangedEventHandler交互。

----下面的代码----

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Threading;

namespace ListBoxTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    /// 

    public class OasisInstance : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        ObservableCollection<string> _items = new ObservableCollection<string>();
        public ObservableCollection<string> ShowList
        {
            get { return _items; }
            set {
                if (_items != value)
                {
                    _items = value; NotifyPropertyChanged();
                }
            }
        }

        private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class MainApplication
    {
        public OasisInstance OasisInst  = new OasisInstance();
    }

    public partial class MainWindow : Window
    {
        MainApplication mainApp = new MainApplication();
        DispatcherTimer timer = new DispatcherTimer();

        public MainWindow()
        {
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += (s, e) => { mainApp.OasisInst.ShowList.Add(DateTime.Now.ToString()); };
            timer.Start();

            InitializeComponent();

            lbxShows.ItemsSource = mainApp.OasisInst.ShowList;
        }
    }
}

答案 1 :(得分:0)

mainApp ShowList所需要的只是

public ObservableCollection<string> ShowList {get; set;}

你必须拥有getters和setters才能发挥作用。