Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
3 / 3 / 1
Регистрация: 05.06.2019
Сообщений: 75

Перенести готовый код в паттерн MVVM

14.10.2019, 14:59. Показов 3999. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток,

(из моей прошлой темы Обмен данными между двумя окнами WPF решился таки создать приложение с нуля в рамках паттерна MVVM)

Есть измерительный датчик с блоком преобразования RS485 -> USB. Производитель предоставил пример работы с этим датчиком на C#. Решение примера содержит два проекта, один проект это библиотека для обмена данными с датчиком и во втором проекте окно с выводом значений датчика на экран (WinForm). То есть это просто как бы голое "ядро", в котором реализован обмен между компьютером и датчиком.

Я перенёс это решение в WPF. WPF я выбрал как более современную технологию с более приятным интерфейсом, по сравнению с WinForm. Так же очень нравиться что в WPF интерфейс рисуется в XAML.

Теперь нужно перенести это самое "ядро" в MVVM, а именно из code-behind в Model и ViewModel, но пока не получается, нужна помощь.

Код MainWindow:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<Window x:Class="DevTemplate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DevTemplate"
        mc:Ignorable="d"
        Title="DevTemplate" Height="320" Width="640" Loaded="Window_Loaded" Closing="Window_Closing">
    <Grid x:Name="MainGrid" Background="AliceBlue">
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
 
        <TextBlock x:Name="tbResult"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontSize="32"/>
 
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using MillimarN1700LibCSharp;
using System;
using System.Windows;
using System.ComponentModel;
using System.Runtime.InteropServices;
 
namespace DevTemplate
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        double GetMeasureResult;
 
        public N1700Lib.N1700MsgCallback MCallback;
        public N1700Lib.N1700DataCallback DCallback;
 
        bool DataCallbackRegistered = false;
 
        int iResult;
        uint NumModules;
        uint NumChannels;
 
        bool Measuring = false;
 
        int LastTick;
 
        static int MaxModuleCount = 2;
        static int MaxChannelCount = 3;
 
        string VersionDll;
        string ValsSec;
        string LedUsbStick;
        string LedSwitch;
        string StatusMeasure;
 
        N1700Lib.sN1700_Module[] aN1700_Module = new N1700Lib.sN1700_Module[MaxModuleCount];
        N1700Lib.sN1700_Channel[] aN1700_Channel = new N1700Lib.sN1700_Channel[MaxChannelCount];
 
        N1700Lib.N1700version ver = new N1700Lib.N1700version();
 
        public MainWindow()
        {
            InitializeComponent();
 
            iResult = N1700Lib.N1700InitializeLibrary(false, out NumModules, out NumChannels, 0);
 
            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ver));
            int result = N1700Lib.N1700GetVersion(ptr);
            ver = (N1700Lib.N1700version)Marshal.PtrToStructure(ptr, typeof(N1700Lib.N1700version));
 
            VersionDll = (ver.N1700lib.major).ToString("D2") + "." + ver.N1700lib.minor.ToString("D2") + "-" + ver.N1700lib.micro.ToString("D2");
 
            MCallback = new N1700Lib.N1700MsgCallback(MsgCallback);
            N1700Lib.N1700RegisterMsgCallback(MCallback);
 
            GetModulesData();
            GetChannelsData();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            StartStop();
        }
 
        private void Window_Closing(object sender, CancelEventArgs e)
        {
            StartStop();
            N1700Lib.N1700UnregisterDataCallback(DCallback);
            N1700Lib.N1700FreeLibrary();
        }
 
        unsafe public void MsgCallback(int msg, uint channel, int param)
        {
            switch (msg)
            {
                //----------------------------------------------------------------------------------------------------------------------------------
                case N1700Lib.WM_N1700_Tick:
                    if (LedUsbStick == "Gray") LedUsbStick = "Lime";
                    else LedUsbStick = "Gray";
                    break;
                //----------------------------------------------------------------------------------------------------------------------------------
                case N1700Lib.WM_N1700_ModuleCountChanged:
                    NumModules = (uint)param;
                    GetModulesData();
 
                    break;
 
                //----------------------------------------------------------------------------------------------------------------------------------
                case N1700Lib.WM_N1700_ChannelCountChanged:
                    NumChannels = (uint)param;
                    GetChannelsData();
 
                    break;
                case N1700Lib.WM_N1700_MwProSek:
                    ValsSec = param.ToString();
                    break;
                case N1700Lib.WM_N1700_Switch:
                    if (param > 0) LedSwitch = "Lime";
                    else LedSwitch = "Gray";
                    break;
                case N1700Lib.WM_N1700_Communication:
                    break;
 
            }
        }
 
        unsafe public void DataCallback(int numChannels, IntPtr pChannelIdxArray, IntPtr pData, IntPtr context)
        {
            if (Environment.TickCount > LastTick + 10)
            {
                int[] ChIdxArray = new int[numChannels];
                double[] DataArray = new double[numChannels];
 
                Marshal.Copy(pChannelIdxArray, ChIdxArray, 0, numChannels);
                Marshal.Copy(pData, DataArray, 0, numChannels);
 
                GetMeasureResult = DataArray[1];
 
                tbResult.Text = GetMeasureResult.ToString(); //------------- ВЫВОД ДАННЫХ НА ЭКРАН -----------------
 
                LastTick = Environment.TickCount;
            }
        }
 
        unsafe public void RegisterDataCallback()
        {
            int i;
            uint[] pChannelIdxArray = new uint[MaxChannelCount];
            IntPtr pContext = new IntPtr(0);
 
            for (i = 0; i < NumChannels; i++)
            {
                pChannelIdxArray[i] = aN1700_Channel[i].ChannelIdx;
            }
            DCallback = new N1700Lib.N1700DataCallback(DataCallback);
            N1700Lib.N1700RegisterDataCallback(DCallback, (int)NumChannels, pChannelIdxArray, pContext);
        }
 
        unsafe public void GetModulesData()
        {
            uint i, q;
            IntPtr ptr;
 
            for (i = 0; i < NumModules; i++)
                if (i < MaxModuleCount)
                {
                    ptr = Marshal.AllocHGlobal(Marshal.SizeOf(aN1700_Module[i]));
                    iResult = N1700Lib.N1700GetModule(i, ptr);
                    aN1700_Module[i] = (N1700Lib.sN1700_Module)Marshal.PtrToStructure(ptr, typeof(N1700Lib.sN1700_Module));
 
                }
        }
 
        unsafe public void GetChannelsData()
        {
            uint i, q;
            IntPtr ptr;
 
            for (i = 0; i < NumChannels; i++)
                if (i < MaxChannelCount)
                {
                    ptr = Marshal.AllocHGlobal(Marshal.SizeOf(aN1700_Channel[i]));
                    iResult = N1700Lib.N1700GetChannel(i, ptr);
                    aN1700_Channel[i] = (N1700Lib.sN1700_Channel)Marshal.PtrToStructure(ptr, typeof(N1700Lib.sN1700_Channel));
                    if (aN1700_Channel[i].ChannelIdx == 0)
                    {
 
                    }
                }
            for (i = NumChannels; i < MaxChannelCount; i++)
                for (q = 0; q <= 5; q++)
 
            if (DataCallbackRegistered) N1700Lib.N1700UnregisterDataCallback(DCallback);
            RegisterDataCallback();
            DataCallbackRegistered = true;
 
            N1700Lib.N1700RequestAllData(0);
        }
 
        void StartStop()
        {
            if (!Measuring)
            {
                N1700Lib.N1700StartContinuousRequestAllData(0, 0);
                StatusMeasure = "On";
            }
            else
            {
                N1700Lib.N1700StopContinuousRequestAllData();
                StatusMeasure = "Off";
            }
            Measuring = !Measuring;
        }
 
        void GetCalib()
        {
            float fOffsetMM = 0;
            float fDigitsToMM = 0;
            float fGain = 0;
            bool bIsActive = false;
 
            N1700Lib.N1700GetCustomerCalibration(1, ref fOffsetMM, ref fDigitsToMM, ref fGain, ref bIsActive);
        }
    }
}
Место где данные выводятся на экран я отметил комментарием.

П.С. Когда разбирался с паттерном MVVM, то все простые примеры, приводимые в интернете, работают и в принципе понятны (по крайней мере суть). Но этот данный код сам по себе довольно сложный для меня и перенести его в MVVM не пойму как...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2019, 14:59
Ответы с готовыми решениями:

Mvvm паттерн
Форумчане , накидал не большое приложение (кошелек) в универе задавали. Изучаю wpf и mvvm не так давно ,но упорно, кому не трудно не могли...

Паттерн MVVM
Добрый день. Все началось с этой темы, где Storm23 дал мне немало ценных советов (за что ему несколько раз спасибо :)) Теперь мне нужен...

Паттерн MVVM
Подскажите пожалуйста какой-нибудь хороший туториал по MVVM (WPF)

22
0 / 0 / 0
Регистрация: 13.01.2022
Сообщений: 2
06.06.2022, 10:37
Студворк — интернет-сервис помощи студентам
dines22, Добрый день! Мне стало очень интересна тема преобразования сигналов с датчика в целях применения в учебном заведении. У меня тоже стоит та же самая задача что и у вас. Хотелось бы по подробнее посмотреть проект реализованный в WPF. Если не затруднит выложить свой готовый проект. Заранее благодарю!
0
3 / 3 / 1
Регистрация: 05.06.2019
Сообщений: 75
07.06.2022, 03:41  [ТС]
Добрый день, _rasul_FT, теоретически, проект можно собрать из моего поста №4 этой темы, но смысла в этом нет, потому что:
1. Эта тема была не о преобразовании сигналов с датчиков как таковом, а о структуризации кода в MVVM паттерн.
2. Датчиков существует огромное разнообразие. Код в данной теме работает только с конкретным измерительным модулем конкретного производителя (линейка N1700 фирмы Mahr).

Конкретизируйте Вашу задачу (что есть, какие именно датчики и т.д.) в новой теме.
1
0 / 0 / 0
Регистрация: 13.01.2022
Сообщений: 2
11.06.2022, 07:02
Спасибо! На WinForm делаю вывод на экран результатов и автоматическая запись в базу данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2022, 07:02

Паттерн mvvm
Здравствуйте! Подскажите, пожалуйста, как реализовать паттерн mvvm на wpf? Читал разные статьи, смотрел видеоуроки. Там пишут model -...

Паттерн MVVM
Учитывая мои предыдущие вопросы по теме https://www.cyberforum.ru/wpf-silverlight/thread2487359.html#post13748905 Как будет выглядить...

Паттерн MVVM в WPF
Кто хорошо знает паттерн MVVM на WPF?

MVVM паттерн и привязка данных
Доброго времени суток! Относительно недавно начал изучать данный паттерн и технологию в целом. Не могу привязать данные к datagrid ...

MVVM паттерн. Что такое ViewModel?
Всем доброго времени. Перехожу с winform на wpf и никак не могу понять что такое ViewModel. Что то вроде посредника между данными и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru