我真的努力理解绑定。我知道有很多其他线程与这个线程具有相同的标题,但是他们都试图做一些比我更复杂的事情,并且所有的答案都假设了一大堆我不知道的东西: (
我正在尝试显示动态更新的消息日志。我已经定义了一个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#”,我只是没有得到它。)
答案 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。