2016-12-28 16 views
-1

DataGridに何も表示されませんが、バインドされたクラスにはデータ行が含まれています。ご覧のとおり、私のMockSnifferSourceクラスはListから派生しています。これは、コレクションがIListに基づいているという要件を満たすはずです。WPF DataGridにList <>が表示されない

<Window x:Class="WpfSniffer.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfSniffer" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid x:Name="dataGrid" Height="Auto" Width="Auto" 
       HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" 
       ItemsSource="{Binding}" AutoGenerateColumns="True"> 
     <DataGrid.DataContext> 
      <local:MockSnifferSource/> 
     </DataGrid.DataContext> 
    </DataGrid> 
</Grid> 

public class MockSnifferSource : List<SnifferMessage> 
{ 
    public MockSnifferSource() 
    { 
     Add(new SnifferMessage 
     { Node = "One", Command = 1, Time = DateTime.Now, Payload = "12345", Metadata = "TTD=5" }); 
    } 
} 

public struct SnifferMessage 
{ 
    public string Node; 
    public byte Command; 
    public DateTime Time; 
    public string Payload; 
    public string Metadata;       
} 

誰もが問題の原因を特定することはできますか?

+1

まず、 'List'を使用せず、' ObservableCollection'を使用してください。しかし、ここではあなたの問題ではありません。あなたの問題はおそらくフィールドにバインドしようとしています。できません。 'SnifferMessage'は、フィールドではなくプロパティを持たなければなりません:' public string Node {get;セット; } 'など。最後に、あなたのコレクションがあなたのDataContextであるように見えます。それは良い考えではありません。後で修正するだけです。あなたのビューモデルにコレクションのプロパティを与え、それをバインドします。 –

+0

ありがとうございます。私がその記事を見た直前にこれを見て、愚かな私。ビューモデルが何であるかを把握するのにしばらく時間がかかりましたが、それは下の例にあったので、うまくいきました。 – Cormagh

+0

素晴らしいあなたは彼の答えを受け入れるべきです。 –

答えて

0

エド・プランケットは、あなたが第二に、私は非常コレクションObservableCollectionでビルドを使用することをお勧めし

public class SnifferMessage 
{ 
    public string Node {get; set; } 
    public byte Command { get; set; } 
    public DateTime Time { get; set; } 
    public string Payload { get; set; } 
    public string Metadata { get; set; } 
} 

を動作するように結合するためのために、代わりにfieldspropertiesを持っている必要が言ったように。これにより、コレクションが変更されるたびにUIに変更が反映されるようになります。以下は推奨される実装です

<Window.DataContext> 
    <local:MainViewModel/> 
</Window.DataContext> 

<DataGrid ItemsSource="{Binding SniffMessage}"/> 


public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     SniffMessage = new ObservableCollection<SnifferMessage>(); 
     SniffMessage.Add(new SnifferMessage 
       { Node = "one", Command = 1, Time = DateTime.Now, Payload = "1234", Metadata = "TTD" } 
     ); 

    } 

    public ObservableCollection<SnifferMessage> SniffMessage { get; set; } 

} 
+0

あなたの解決に感謝します。私は錆びているためにプロパティが必要であるという事実を完全に忘れてしまった。以前に使用していたObservableCollectionへのすばらしいアップグレードが評価されている。 – Cormagh

関連する問題