C# DataGrid和ObservableCollection在运行时未更新

C# DataGrid和ObservableCollection在运行时未更新,c#,wpf,xaml,datagrid,observablecollection,C#,Wpf,Xaml,Datagrid,Observablecollection,背景: <DataGrid x:Name="SysCheck_DataGrid" BorderBrush="Gray" AutoGenerateColumns="False" ItemsSource="{Binding Path=_SysCheckDataGridSource, Mode=TwoWay}" SelectionMode="Extended" SelectionUnit="Fu

背景:

<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>
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; }
}
我有一个
DataGrid
,其中填充了一个
ObservableCollection
。 在设计时,
可观测集合
将不包含任何项目

我在运行时使用
文本框
的内容更新集合,在导入的.Text/.CSV文件中循环并粘贴剪贴板中的文本。 如下所示,我将集合绑定到XAML中,并在
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>
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; }
}
类别代码:

<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>
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; }
}
回答问题:

<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>
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问:

您的
可观测集合在哪里?您在哪里以及如何向其中添加项目

答复:

public ObservableCollection<SystemCheckingNormal> _SysCheckDataGridSource;
位于
MainWindow()的构造函数中

到目前为止,我正在
单击
事件中添加到集合中(在上面的代码中):


您的ObservableCollection属性必须是公共属性。你的情况应该是这样的

public ObservableCollection<SystemCheckingNormal> _SysCheckDataGridSource {get;set;}
publicobservableCollection\u SysCheckDataGridSource{get;set;}

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

您的类需要实现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");
            }
       }
    }
}

只需对所有其他变量执行相同的操作(我只编写了Hostname以让您理解)

\u SysCheckDataGridSource
是一个字段:


您的ObservableCollection在哪里?您在哪里以及如何向其中添加项目?请在使用它们之前阅读
绑定的属性
Mode=TwoWay
对于
ItemsSource
绑定没有意义。@mm8请参阅我的原始答复question@NigelTatschner请看我的答案_SysCheckDataGridSource是一个字段。它一定是一个财产。添加{get;set;}部分。仅当您打算在运行时动态更改单个SystemCheckingNormal对象的属性值时,才需要此部分。这与ObservaleCollection无关。为此,我打算在这部分工作后进行更改:)@DanielThank谢谢,我已经在中添加了更改,但在DataGrid中仍然没有任何内容,我将添加更改更改为:SysCheckDataGridSource.ADD(new SystemCheckingNormal(){Hostname=SysCheck\u Manuel\u Add\u TB.Text});您在什么地方设置了视图的DataContext吗?否,我是否将ItemsSource=“{Binding Path=SysCheckDataGridSource}”更改为其他内容?我可能在这里丢失了一些东西,我是wpf的新成员,cා这是源代码:您缺少设置DataContext。请参阅我的编辑。