2016-12-28 2 views
-1

Mein DataGrid zeigt nichts an, aber meine gebundene Klasse enthält eine Datenzeile. Wie Sie sehen, wird meine MockSnifferSource-Klasse von List abgeleitet, die die Anforderung erfüllen sollte, dass meine Sammlung auf IList basiert.WPF DataGrid zeigt keine Liste an <>

<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;       
} 

Kann jemand die Quelle des Problems identifizieren?

+1

Erstens, verwenden Sie nicht "List", verwenden Sie "ObservableCollection". Aber das ist nicht dein Problem hier. Ihr Problem hier versucht wahrscheinlich, an Felder zu binden. Du kannst nicht. 'SnifferMessage' sollte Eigenschaften haben, keine Felder:' public string Node {get; einstellen; } usw. Zum Schluss sieht es so aus, als wäre Ihre Sammlung Ihr DataContext. Das ist keine gute Idee; Sie müssen es nur später beheben. Geben Sie Ihrem Viewmodel eine Collection-Eigenschaft und binden Sie diese an. –

+0

Danke. Ich habe es herausgefunden, kurz bevor ich die Posts gesehen habe, Dummkopf. Ich brauchte eine Weile, um herauszufinden, was ein Viewmodel war, aber es war im Beispiel unten und es funktionierte. – Cormagh

+0

Großartig. Du solltest seine Antwort akzeptieren. –

Antwort

0

Wie Ed Plunkett sagte Sie properties statt fields zu haben, um benötigen für

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; } 
} 

Zweitens arbeiten zu binden, würde ich hoch in Sammlung ObservableCollection den Build empfehlen die Verwendung. Dadurch ändert sich Ihre Benutzeroberfläche so, dass Änderungen an Ihrer Sammlung vorgenommen werden. Unten ist die bevorzugte Implementierung

<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

Danke für Ihre Lösung. Ich habe die Tatsache komplett übersehen, dass ich Grundstücke brauchte, weil ich verrostet war, und das brillante Upgrade auf ObservableCollection, das ich schon früher benutzt habe, wird geschätzt. – Cormagh

Verwandte Themen