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。请参阅我的编辑。