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代码隐藏文件。