2016-12-28 4 views
-1

My DataGrid ничего не отображает, но мой связанный класс содержит строку данных. Как вы можете видеть, мой класс MockSnifferSource получен из списка, который должен удовлетворять требованию, чтобы моя коллекция была основана на IList.WPF DataGrid не отображает Список <>

<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. Это не очень хорошая идея; вам нужно будет исправить это позже. Дайте вашему viewmodel свойство collection и привязайтесь к нему. –

+0

Спасибо. Понял это, как раз перед тем, как увидел столбы, глупый. Понадобился немного времени, чтобы выяснить, что такое viewmodel, но это было в примере ниже, и это сработало. – Cormagh

+0

Отлично. Вы должны принять его ответ. –

ответ

0

Как Эд Планкетт сказал, что вы должны иметь properties вместо fields для того, чтобы связывание работать

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

Во-вторых, я бы настоятельно рекомендуем использовать сборку в коллекции ObservableCollection. Это позволит сделать так, чтобы ваш пользовательский интерфейс отражал изменения, если ваша коллекция меняется. Ниже предпочтительная реализация

<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

Смежные вопросы