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

C# 将ObservableCollection绑定到ListBox(简单案例?),c#,wpf,xaml,binding,observablecollection,C#,Wpf,Xaml,Binding,Observablecollection,我真的很难理解绑定。我知道还有很多其他的主题和这个主题差不多,但是他们都试图做一些比我更复杂的事情,所有的答案都假设了一大堆我不懂的东西:( 我正在尝试显示动态更新的消息日志。我已定义了一个消息类: public class Message { public DateTime Timestamp { get; private set; } public string Value { get; private set; } public int Severity { get

我真的很难理解绑定。我知道还有很多其他的主题和这个主题差不多,但是他们都试图做一些比我更复杂的事情,所有的答案都假设了一大堆我不懂的东西:(

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

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()
    { }
}
在主窗口构造函数中,我初始化日志:

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    Log = new Model.MessageLog();
    // and so on
}
在主窗口的XAML中,我有:

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

现在,如果我将消息实例添加到消息日志中,我希望看到它们出现在列表框中。它们没有。我错过了什么


提前感谢(如果你能给我指出一个明确解释绑定的地方——特别是XAML对代码的看法以及它可以在哪里查找东西——那么在顶部还有更多的感谢。目前我正在使用Matthew McDonald的“C#中的Pro WPF 4.5”,我只是不明白而已。)

更改你的构造函数:

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

public MainWindow()
{
    InitializeComponent();
    Log = new Model.MessageLog(); // <- This line before setting the DataContext
    DataContext = this;
}
窗口构造函数:

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

您的集合属性名为
Log
,这是您应该在
ItemsSource
属性中绑定到的;如果您没有在问题中输入错误,则您将错误绑定到
MessageLog
,并更改
绑定,如下所示:

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


有关WPF(4.5)中数据绑定的更多信息和学习,请参见视图的datacontext必须是viewmodel。

datacontext
只是为UI层设置数据层。当遵循
MVVM设计模式时,我同意您的看法,
datacontext
应该指向
viewmodel
。不过,OP似乎不遵循
MVVM
,因此在这种情况下,可以将视图的数据层设置为W XAMLs代码隐藏文件。