代码之家  ›  专栏  ›  技术社区  ›  mega_creamery

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

  •  1
  • mega_creamery  · 技术社区  · 6 年前

    我一直在跟踪 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 ;
        }
    

    XAML中的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文件提供单独的文件夹,而不是在主类中发生的所有事情。

    我希望整个结构大致相似
    查看<-&燃气轮机;视图模型<-&燃气轮机;模型

    这是我的主窗口.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 回复  |  直到 6 年前
        1
  •  1
  •   mm8    6 年前

    你应该设置 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 DataGrid 表DAT 返回 ObservableCollection<LineViewModel> 使用 {Binding}

    <DataGrid ItemsSource="{Binding TableDat}" ... />