背景
我的DataGrid
填充了ObservableCollection
。
ObservableCollection
不会在设计时中包含任何项目。
我使用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 });
答案 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");
}
}
}
}
对所有其他变量做同样的事情(我只写了主机名让你明白)