Попытка переместить привязку данных из MainWindow.xaml.cs в другой модуль ViewModel - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать таблицу значений, поступающих из последовательного порта.Таблица обновится, как только новые данные поступят в последовательный порт.

Пока существует только один файл xaml.

Я следил за этой реализацией, которая работала такдалеко, но только когда я назначаю массив объектов DataGrid в MainWindow.xaml.cs (как в этом примере), который выглядел так:

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 ;
    }

DataGrid в XAML выглядел так:

  <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 с отдельными папками для моделей, моделей представления, файлов просмотра и не всего, что происходит внутри класса Main.

Я хочу, чтобы вся структура приблизительно напоминала
View <-> ViewModel <-> Model

Для этого я создал другой файл 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 голосов
/ 09 октября 2018

Вы должны установить свойство 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 со свойством TableDat модели представления.который возвращает ObservableCollection<LineViewModel> с использованием синтаксиса {Binding}:

<DataGrid ItemsSource="{Binding TableDat}" ... />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...