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がコードとそれを探すことができる場所についてのビューを教えていただければ、さらに多くの感謝を込めて。現時点ではマシューを使用しています。 McDonald の「Pro WPF 4.5 in C#」ですが、私にはわかりません。)

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.LognullDataBinding の時点であり、WPF はそれが変更されたことを通知されません。

そうは言っても、通常、UI 要素 (ウィンドウなど) 内にデータを配置することはありません。WPF への受け入れられ推奨されるアプローチはMVVMです。通常、ViewModel を作成し、それを として設定しWindowます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あるものです。質問にタイプミスがない場合は、 に間違ってバインドしていることになり、次のように変更します。ItemsSourceMessageLogBinding

<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 に答える