0

真的很难理解绑定。我知道有很多其他线程的标题与这个线程几乎相同,但他们都在尝试做一些比我更复杂的事情,所有的答案都假设一大堆我没有得到的东西: (

我正在尝试显示动态更新的消息日志。我定义了一个 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麦当劳的“C# 中的 Pro WPF 4.5”,我只是不明白。)

4

3 回答 3

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,因此值this.Lognull在 DataBinding 时,并且 WPF 永远不会被通知它曾经更改过。

话虽如此,您通常不会将数据放入 UI 元素(例如窗口)中。WPF 接受和推荐的方法是MVVM,您通常在其中创建一个 ViewModel 并将其设置为Window's DataContext

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

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

窗口构造函数:

public MainWindow
{
   DataContext = new MyViewModel();
}
于 2013-10-08T16:42:30.997 回答
0

您的集合属性名称是Log应该ItemsSource属性中绑定的名称;如果你没有在你的问题中打错字,那么你错误地绑定到MessageLog,并更改Binding如下:

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

有关Data BindingWPF (4.5) 的更多信息和学习,请参阅MSDN 数据绑定概述

于 2013-10-08T16:48:51.163 回答
0

视图的数据上下文必须是视图模型。

于 2013-10-09T08:28:39.230 回答