试图将数据绑定从MainWindow.xaml.cs移动到另一个ViewModel模块

时间:2018-10-09 14:53:32

标签: c# wpf xaml mvvm data-binding

我正在尝试创建一个来自串行端口的值表。新数据到达串行端口后,表将立即更新。

到目前为止,只有一个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正确传递了数组,那么我也可以在那里做其他事情,而不是再花几天的时间(个星期),试图弄清楚如何正确或完全做到这一点。

谢谢

1 个答案:

答案 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}