DataGrid和ObservableCollection不在运行时更新

时间:2017-06-19 13:23:26

标签: c# wpf xaml datagrid observablecollection

背景

我的DataGrid填充了ObservableCollectionObservableCollection不会在设计时中包含任何项目。

我使用TextBox的内容更新运行时的集合,循环导入.Text / .CSV文件并粘贴剪贴板中的文本。 正如您将在下面看到的,我在XAML中绑定集合并在DataGrid中指定列详细信息。

使用类来启动集合以显示数据。

我可以点击按钮直接将项目添加到DataGrid,但是当我将其添加到ObservableCollection时,虽然它已添加到集合中,但它不会显示。

XAML:

<DataGrid x:Name="SysCheck_DataGrid" 
          BorderBrush="Gray"
          AutoGenerateColumns="False"
          ItemsSource="{Binding Path=_SysCheckDataGridSource, Mode=TwoWay}"
          SelectionMode="Extended"
          SelectionUnit="FullRow"
          CanUserDeleteRows="True"
          CanUserReorderColumns="True"
          AlternatingRowBackground="Gainsboro"
          AlternationCount="2">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Hostname" Binding="{Binding Hostname}"/>
    <DataGridTextColumn Header="IP Address" Binding="{Binding IPAddress}"/>
    <DataGridTextColumn Header="Online" Binding="{Binding Online}"/>
    <DataGridTextColumn Header="Last Restarted" Binding="{Binding LastRestarted}"/>
    <DataGridTextColumn Header="OS" Binding="{Binding OS}"/>
  </DataGrid.Columns>
</DataGrid>

C#背后的代码:

private void SysCheck_Add_Button_Click(object sender, RoutedEventArgs e)
{
    if (!string.IsNullOrWhiteSpace(SysCheck_Manuel_Add_TB.Text))
    {
        var item = _SysCheckDataGridSource.SingleOrDefault(
            i => i.Hostname == SysCheck_Manuel_Add_TB.Text);

        if (item == null)
        {
            SysCheck_DataGrid.Items.Add(new SystemCheckingNormal()
                { Hostname = SysCheck_Manuel_Add_TB.Text });

            SystemChecking_Log.Text += Environment.NewLine + SysCheck_Manuel_Add_TB.Text
                + " was added to DataGrid " + "There are "
                + _SysCheckDataGridSource.Count + " items in the list";

            SysCheck_Manuel_Add_TB.Clear();
        }
        else
        {
            SystemChecking_Log.Text += Environment.NewLine + SysCheck_Manuel_Add_TB.Text
                + " Is already in the DataGrid " + "There are "
                + _SysCheckDataGridSource.Count + " items in the list";

            SysCheck_Manuel_Add_TB.Clear();
        }
    }
}

课程代码:

public class SystemCheckingNormal
{
    public string Hostname { get; set; }
    public string IPAddress { get; set; }
    public string Online { get; set; }
    public string LastRestarted { get; set; }
    public string OS { get; set; }
}

回答问题:

mm8问:

您的ObservableCollection在哪里以及在何处以及如何向其中添加项目?

答案:

public ObservableCollection<SystemCheckingNormal> _SysCheckDataGridSource;

MainWindow班级

_SysCheckDataGridSource = new ObservableCollection<SystemCheckingNormal>();

位于MainWindow()构造函数中。

到目前为止,我在Click事件中添加了该集合(在上面的代码中):

SysCheck_DataGrid.Items.Add(new SystemCheckingNormal()
    { Hostname = SysCheck_Manuel_Add_TB.Text });

3 个答案:

答案 0 :(得分:1)

您的ObservableCollection属性必须是公共属性。在你的情况下它应该看起来像

public ObservableCollection<SystemCheckingNormal> _SysCheckDataGridSource {get;set;}

DataGrid的DataContext必须是具有此属性的实例。

答案 1 :(得分:0)

_SysCheckDataGridSource字段

public ObservableCollection<SystemCheckingNormal> _SysCheckDataGridSource; 

您只能绑定到WPF中的公共属性(但不能绑定字段):

public ObservableCollection<SystemCheckingNormal> SysCheckDataGridSource { get; set; }

另请注意,您应该从属性名称中删除下划线(请记住在XAML标记中也要修改它)。

您还需要设置视图的DataContext

public MainWindow()
{
    InitializeComponent();
    SysCheckDataGridSource = new ObservableCollection<SystemCheckingNormal>();
    DataContext = this;
}

答案 2 :(得分:-2)

你的班级需要像这样实现INotifyPropertyChanged

public class SystemCheckingNormal : INotifyPropertyChanged
{
    private string hostname ;
    private string iPAddress ;
    private string online ;
    private string lastRestarted ;
    private string oS ;
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
    Public string Hostname
    {
       get{return hostname;}
       set
       {
          if(hostname != value)
            {
              hostname = value;
              OnPropertyChanged("Hostname");
            }
       }
    }
}

对所有其他变量做同样的事情(我只写了主机名让你明白)