我正在尝试创建一个来自串行端口的值表。新数据到达串行端口后,表将立即更新。
到目前为止,只有一个xaml文件。
到目前为止,我一直在遵循this实现,但是仅当我在MainWindow.xaml.cs中将对象数组分配给DataGrid时(如该示例),该实现以前一直是这样的:
public MainWindow()
{
InitializeComponent();
var TableDat = new ObservableCollection<LineViewModel>()
{
new LineViewModel(1,2,888,6,5), // Random values to see if anyhting dipslays
new LineViewModel(122,2,888,6,5),
};
this.dataGrid1.ItemsSource = TableDat ;
}
Xp中的DataGrid看起来像这样:
<DataGrid AutoGenerateColumns="False"
Height="Auto"
HorizontalAlignment="Left"
Name="dataGrid1"
VerticalAlignment="Top"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
Grid.Row="1">
<DataGrid.Columns >
<DataGridTextColumn Binding="Item1" Width="*">
<DataGridTextColumn Binding="Item2" Width="*" />
<DataGridTextColumn Binding="Item3" Width="*" />
<DataGridTextColumn Binding="Item4" Width="*" />
<DataGridTextColumn Binding="Item5" Width="*" />
</DataGrid.Columns>
</DataGrid>
我想将我的项目划分为我认为是正确的MVVM布局,并具有用于Models,ViewModels,View文件的单独文件夹,而不是Main类中发生的所有事情。
我希望整个结构大致相似
视图<-> ViewModel <->模型
为此,我创建了另一个文件DataGridViewModel.cs,它将实例化对象数组并将其传递给dataGrid1 DataGrid。
这是我的MainWindow.xaml.cs
public partial class MainWindow : Window {
private DataGridViewModel _dat = new DataGridViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _dat;
}
}
这是我想从中将对象数组传递给上述DataGrid的类。
class DataGridViewModel : ObservableObject
{
public ObservableCollection<LineViewModel> TableDat { get; private set; }
public DataGridViewModel()
{
var TableDat = new ObservableCollection<LineViewModel>()
{
new LineViewModel(1,2,888,6,5),
new LineViewModel(122,2,888,6,5),
};
//Here I would like to pass the object array to the data grid, dataGrid1
}
}
现在
this.dataGrid1.ItemsSource = TableDat;
收益率:
Severity Code Description Project File Line Suppression State Error CS1061
'DataGridViewModel' does not contain a definition for 'dataGrid1' and no accessible
extension method 'dataGrid1' accepting a first argument of type 'DataGridViewModel'
could be found(are you missing a using directive or an assembly reference ?)
我猜这是因为我试图将其传递给MainWindow.xaml而不是DataGrid.xaml。
如果我将this
更改为MainWindow
并尝试
MainWindow.dataGrid1.ItemsSource = TableDat;
我希望它将链接到我得到的相应xaml文件:
Severity Code Description Project File Line Suppression State Error CS0120
An object reference is required for the non-static field, method, or property
'MainWindow.dataGrid1'
我对面向对象的知识还不陌生,现在很多这样的概念让我望而却步,因此,如果我没有明确表达自己想表达的内容或使用正确的术语,请原谅我。
我正处于失败的境地,接受的是,如果我设法从MainWindow.xaml.cs正确传递了数组,那么我也可以在那里做其他事情,而不是再花几天的时间(个星期),试图弄清楚如何正确或完全做到这一点。
谢谢
答案 0 :(得分:1)
您应该设置视图模型的TableDat
属性。为此,您只需要从构造函数中删除var
关键字:
class DataGridViewModel : ObservableObject
{
public ObservableCollection<LineViewModel> TableDat { get; private set; }
public DataGridViewModel()
{
TableDat = new ObservableCollection<LineViewModel>()
{
new LineViewModel(1,2,888,6,5),
new LineViewModel(122,2,888,6,5),
};
}
}
然后,您可以将ItemsSource
的{{1}}属性绑定到视图模型的DataGrid
属性,该视图模型使用TableDat
语法返回ObservableCollection<LineViewModel>
:
{Binding}