将ObservableCollection绑定到ListBox(简单案例?)

时间:2013-10-08 16:40:16

标签: c# wpf xaml binding observablecollection

真的努力理解绑定。我知道有很多其他线程与这个线程具有相同的标题,但是他们都试图做一些比我更复杂的事情,并且所有的答案都假设了一大堆我不知道的东西: (

我正在尝试显示动态更新的消息日志。我已经定义了一个Message类:

public class Message
{
    public DateTime Timestamp { get; private set; }
    public string Value { get; private set; }
    public int Severity { get; private set; }
    public Message(string value, int severity)
    {
        Timestamp = DateTime.Now;
        Value = value;
        Severity = severity;
    }
}

我将MessageLog类定义为:

public class MessageLog: ObservableCollection<Message>
{
    public MessageLog(): base()
    { }
}

在我的MainWindow构造函数中,我有一个Log属性:

public MessageLog Log { get; private set; }

在MainWindow构造函数中,我初始化Log:

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    Log = new Model.MessageLog();
    // and so on
}

在主窗口的XAML中我有:

<ListBox Name="MessagePanel" Height="100" ItemsSource="{Binding MessageLog}" IsEnabled="False"/>

现在,如果我将Message实例添加到MessageLog,我希望看到它们出现在ListBox中。他们没有。我错过了什么?

提前感谢(如果你能指出我解释绑定明确的地方 - 尤其是XAML对代码的看法以及它可以寻找的东西 - 那么还要多谢目前我正在使用Matthew McDonald的“Pro#WPF 4.5 in C#”,我只是没有得到它。)

3 个答案:

答案 0 :(得分:0)

更改构造函数:

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    Log = new Model.MessageLog();
}

到此:

public MainWindow()
{
    InitializeComponent();
    Log = new Model.MessageLog(); // <- This line before setting the DataContext
    DataContext = this;
}

<强>解释

设置属性 设置DataContext后,需要您的类实现INotifyPropertyChanged并在设置属性后引发更改通知。

由于您在设置属性之前设置了DataContext ,因此在DataBinding时this.Log的值为null,并且WPF永远不会被通知改变。

话虽如此,您通常不会将 Data 放在UI Elements(例如Window)中。接受和推荐的WPF方法是MVVM,您通常会创建一个ViewModel并将其设置为Window的{​​{1}}:

DataContext

Window Constructor:

public class MyViewModel
{
    public MessageLog Log {get;set;}

    public MyViewModel()
    {
        Log = new MessageLog();
    }
}

答案 1 :(得分:0)

您的收藏品属性名称为 Log ,这是应绑定ItemsSource属性中的内容;如果您在问题中没有输入拼写错误,那么您错误地约束MessageLog,并更改Binding,如下所示:

<ListBox Name="MessagePanel" Height="100" ItemsSource="{Binding Log}" IsEnabled="False"/>

有关WPF(4.5)中Data Binding的更多信息和学习信息,请参阅MSDN Data Binding Overview

答案 2 :(得分:0)

视图的datacontext必须是viewmodel。