以编程方式将ObservableCollection绑定到ListBox

时间:2011-12-01 16:02:01

标签: c# wpf binding

这个问题看起来像这样: Programmatically binding List to 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。

我不想在xaml代码中使用{Binding}。

我试过这段代码:

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 个答案:

答案 0 :(得分:6)

您发布的代码将失败,因为“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);
    }
}

答案 1 :(得分:2)

第一种情况不起作用,因为绑定仅适用于属性。如果您创建一个属性,如最后所示它应该工作,当然,绑定对象的DataContextBinding.Source是包含该属性的对象。

你得到绑定错误吗?你试过debug it吗?