質問編集履歴

4

質問内容を整理しました。

2017/05/09 06:12

投稿

maroaig
maroaig

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,14 +1,14 @@
1
1
  ###前提・実現したいこと
2
2
 
3
- C#で、MVVMを使用したプログラムを作成したいと思います。
4
-
5
- 複数の解釈とコード例が検索されますが、なかなか納得する
3
+ MVVMで、Web検索しますと、複数の解釈とコード例が検索されますが、基本的例が見つりません。
4
+
6
-
5
+ そこで、MS社の資料を参考にC# Prism Unityで、MVVM構造の単純なプログラムを作成しました。
6
+
7
+
8
+
7
- 例が見つかりません。
9
+ <作成内容>
8
-
9
-
10
-
10
+
11
- 「テキストボックスにそれぞれ、ある数Aとある数Bを入力し、ボタンを押すとラベルに結果を表示する。」
11
+ テキストボックスに、ある数Aとある数Bを入力し、ボタンを押すとラベルに結果を表示する。」
12
12
 
13
13
 
14
14
 
@@ -16,69 +16,25 @@
16
16
 
17
17
 
18
18
 
19
+ <課題>
20
+
19
- これを、Prismを使って、Boost View、ViewModel Model 分離し大企業向け開発体制を考慮しと、只の足し算が信じられない複雑なプログラムになりま
21
+ 素直に、ままりますと、只の足し算が信じられない複雑なプログラムになりました
22
+
20
-
23
+ 簡単なプログラムにする良い方法を検討しています。
21
-
22
-
24
+
25
+
26
+
23
- ここに質問したいことを詳細に書いてください
27
+ ###ここに質問したいことを詳細に書いてください
24
-
25
-
26
-
27
- MSDNの説明は、応用的、基本が見えないと思います。そこで
28
+
28
-
29
- MVVMの単純な基本、Prismを使用した定石はどんなものとなりますか?
29
+
30
-
31
-
32
-
33
- ###発生している問題・エラーメッセージ
30
+
34
-
35
- 1.View+ViewModelだけで、MVVM
36
-
37
- 2.View+ViewModel+Model
38
-
39
- 3.View+ViewModel+Control
40
-
41
- 4.View+ViewModel+プレゼンテーション
42
-
43
- なぜか、使いこなすには至らない。
44
-
45
- ここで、これが、良いパターンとは、説明できない。
46
-
47
- 複雑過ぎではないかなぁ工数を費やす気になれないのは私だけでしょうか?
48
-
49
-
50
-
51
- エラーメッセージ
52
-
53
- 1.モジュール分け、ファイル分割で、プログラムの動が見え
31
+ C# Prism Unityで、MVVM構造プログラム成する場合、定石的方法で、簡単コードをご教授下さい
54
-
55
- 2.工数が増大する。
56
-
57
- 3.保守が難しい。
58
32
 
59
33
 
60
34
 
61
35
  ###該当のソースコード
62
36
 
63
- この例が一番良いと思います。
37
+
64
-
65
- しかし、最新のメソッドを使用している様子、基本的では無いのでは
66
-
67
- と思い質問しました。
68
-
69
- http://qiita.com/hiki_neet_p/items/e381c687b0644c0e4978
70
-
71
-
72
-
73
- ###試したこと
74
-
75
- ToReactivePropertyAsSynchronized()の調査
76
-
77
- 只の足し算でも、ここまでになるのは理解に苦しむ。
78
-
79
-
80
-
81
- ###補足情報(言語/FW/ツール等のバージョンなど)
82
38
 
83
39
  マイクロソフト社の解説書
84
40
 
@@ -90,7 +46,7 @@
90
46
 
91
47
 
92
48
 
93
- (基本プログラム作成
49
+ 複雑になった基本プログラム)
94
50
 
95
51
  ![イメージ説明](78f3fa4f171e55f15d7fc1a4c24ec07a.png)
96
52
 

3

コードを追加する。

2017/05/09 06:12

投稿

maroaig
maroaig

スコア14

test CHANGED
File without changes
test CHANGED
@@ -87,3 +87,465 @@
87
87
  MVVM関連
88
88
 
89
89
  https://www.microsoft.com/ja-JP/download/details.aspx?id=39042
90
+
91
+
92
+
93
+ (基本プログラム作成)
94
+
95
+ ![イメージ説明](78f3fa4f171e55f15d7fc1a4c24ec07a.png)
96
+
97
+
98
+
99
+ 1.準備
100
+
101
+ VisualStudioCommunity2015
102
+
103
+ wpfアプリケーションのプロジェクト
104
+
105
+ NuGetパッケージ管理より
106
+
107
+ Prism、Prism.Unitをインストール
108
+
109
+
110
+
111
+ 2.Composite Application Libraryを学ぶ
112
+
113
+ 2-1 App.XAML
114
+
115
+ ```XAML言語
116
+
117
+ <Application x:Class="WpfMVVMPrism.App"
118
+
119
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
120
+
121
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
122
+
123
+ xmlns:local="clr-namespace:WpfMVVMPrism"
124
+
125
+ Startup ="Application_Startup">
126
+
127
+ <Application.Resources>
128
+
129
+ </Application.Resources>
130
+
131
+ </Application>
132
+
133
+ ```
134
+
135
+ 2-2 App.XAML.cs
136
+
137
+ ```C#言語
138
+
139
+ using System.Windows;
140
+
141
+ namespace WpfMVVMPrism
142
+
143
+ {
144
+
145
+ /// <summary>
146
+
147
+ /// App.xaml の相互作用ロジック
148
+
149
+ /// </summary>
150
+
151
+ public partial class App : Application
152
+
153
+ {
154
+
155
+ private void Application_Startup(object sender, StartupEventArgs e)
156
+
157
+ {
158
+
159
+ var boot = new Bootstrap();
160
+
161
+ boot.Run();
162
+
163
+ }
164
+
165
+ }
166
+
167
+ }
168
+
169
+ ```
170
+
171
+ 2-3 Bootstrap.cs Shellをコンテナに登録(最小コード)
172
+
173
+ ```C#言語
174
+
175
+ using System.Windows;
176
+
177
+ using Microsoft.Practices.Unity;
178
+
179
+ using Prism.Mvvm;
180
+
181
+ namespace WpfMVVMPrism
182
+
183
+ {
184
+
185
+ /// <summary>
186
+
187
+ /// Unity コンテナーを使用する。
188
+
189
+ /// </summary>
190
+
191
+ public class Bootstrap : Prism.Unity.UnityBootstrapper
192
+
193
+ {
194
+
195
+ protected override DependencyObject CreateShell()
196
+
197
+ {
198
+
199
+ return this.Container.Resolve<Shell>();
200
+
201
+ }
202
+
203
+
204
+
205
+ protected override void InitializeShell()
206
+
207
+ {
208
+
209
+ ViewModelLocator.SetAutoWireViewModel(this.Shell, true);
210
+
211
+ ((Shell)this.Shell).Show();
212
+
213
+ }
214
+
215
+ }
216
+
217
+ }
218
+
219
+ ```
220
+
221
+ 2-4 Shell.XAML
222
+
223
+ ```XAML言語
224
+
225
+ <Window
226
+
227
+ x:Class="WpfMVVMPrism.Shell"
228
+
229
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
230
+
231
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
232
+
233
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
234
+
235
+ xmlns:local="clr-namespace:WpfMVVMPrism"
236
+
237
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
238
+
239
+ Title="MVVMの基本その1(計算 A+B=C)"
240
+
241
+ Width="350"
242
+
243
+ Height="200"
244
+
245
+ mc:Ignorable="d">
246
+
247
+
248
+
249
+ <!-- <Window.DataContext>
250
+
251
+ <local:ViewModel />
252
+
253
+ </Window.DataContext> -->
254
+
255
+
256
+
257
+ <Grid>
258
+
259
+ <Grid.ColumnDefinitions>
260
+
261
+ <ColumnDefinition />
262
+
263
+ </Grid.ColumnDefinitions>
264
+
265
+
266
+
267
+ <Grid.RowDefinitions>
268
+
269
+ <RowDefinition />
270
+
271
+ <RowDefinition />
272
+
273
+ <RowDefinition />
274
+
275
+ <RowDefinition />
276
+
277
+ </Grid.RowDefinitions>
278
+
279
+ <TextBox
280
+
281
+ x:Name="textBoxA"
282
+
283
+ Grid.Row="0"
284
+
285
+ Text="{Binding DataA}" />
286
+
287
+ <TextBox
288
+
289
+ x:Name="textBoxB"
290
+
291
+ Grid.Row="1"
292
+
293
+ Text="{Binding DataB}" />
294
+
295
+ <Button
296
+
297
+ x:Name="button"
298
+
299
+ Grid.Row="2"
300
+
301
+ Content="「A+B=C」の計算をする"
302
+
303
+ Command="{Binding CalculationCommand}"/>
304
+
305
+ <Label
306
+
307
+ x:Name="labelC"
308
+
309
+ Grid.Row="3"
310
+
311
+ Content="{Binding ResultC}" />
312
+
313
+ </Grid>
314
+
315
+ </Window>
316
+
317
+ ```
318
+
319
+ 2-5 Shell.XAML.CS
320
+
321
+ ```C#言語
322
+
323
+ using System.Windows;
324
+
325
+ namespace WpfMVVMPrism
326
+
327
+ {
328
+
329
+ /// <summary>
330
+
331
+ /// Shell.xaml の相互作用ロジック
332
+
333
+ /// </summary>
334
+
335
+ public partial class Shell : Window
336
+
337
+ {
338
+
339
+ public Shell()
340
+
341
+ {
342
+
343
+ InitializeComponent();
344
+
345
+ this.DataContext = new ViewModel();
346
+
347
+ }
348
+
349
+ }
350
+
351
+ }
352
+
353
+ ```
354
+
355
+ 2-6 VeiwModel.cs
356
+
357
+ ```C#言語
358
+
359
+ using System;
360
+
361
+ using System.ComponentModel;
362
+
363
+ using System.Windows.Input;
364
+
365
+ namespace WpfMVVMPrism
366
+
367
+ {
368
+
369
+ public class ViewModel : INotifyPropertyChanged
370
+
371
+ {
372
+
373
+ public int DataA { get; set; }
374
+
375
+ public int DataB { get; set; }
376
+
377
+
378
+
379
+ public event PropertyChangedEventHandler PropertyChanged;
380
+
381
+ private int _resultC;
382
+
383
+ public int ResultC
384
+
385
+ {
386
+
387
+ get
388
+
389
+ {
390
+
391
+ return _resultC;
392
+
393
+ }
394
+
395
+ set
396
+
397
+ {
398
+
399
+ _resultC = value;
400
+
401
+ OnPropertyChanged("ResultC");
402
+
403
+ }
404
+
405
+ }
406
+
407
+
408
+
409
+ protected void OnPropertyChanged(string name)
410
+
411
+ {
412
+
413
+ PropertyChangedEventHandler handler = PropertyChanged;
414
+
415
+ if (handler != null)
416
+
417
+ {
418
+
419
+ handler(this, new PropertyChangedEventArgs(name));
420
+
421
+ }
422
+
423
+ }
424
+
425
+
426
+
427
+ private ICommand _calculationCommand;
428
+
429
+ public ICommand CalculationCommand
430
+
431
+ {
432
+
433
+ get
434
+
435
+ {
436
+
437
+ if (_calculationCommand == null)
438
+
439
+ {
440
+
441
+ _calculationCommand = new RelayCommand(ExecuteCalculationCommand);
442
+
443
+ }
444
+
445
+ return _calculationCommand;
446
+
447
+ }
448
+
449
+ }
450
+
451
+
452
+
453
+ private void ExecuteCalculationCommand(object x)
454
+
455
+ {
456
+
457
+ Model m = new Model();
458
+
459
+ m.a_val = DataA;
460
+
461
+ m.b_val = DataB;
462
+
463
+ ResultC = m.SumAB();
464
+
465
+ }
466
+
467
+ }
468
+
469
+
470
+
471
+ internal class RelayCommand : ICommand
472
+
473
+ {
474
+
475
+ private Action<object> executeCalculationCommand;
476
+
477
+
478
+
479
+ public RelayCommand(Action<object> executeCalculationCommand)
480
+
481
+ {
482
+
483
+ this.executeCalculationCommand = executeCalculationCommand;
484
+
485
+ }
486
+
487
+
488
+
489
+ public event EventHandler CanExecuteChanged;
490
+
491
+
492
+
493
+ public bool CanExecute(object parameter)
494
+
495
+ {
496
+
497
+ return true;
498
+
499
+ }
500
+
501
+
502
+
503
+ public void Execute(object parameter)
504
+
505
+ {
506
+
507
+ this.executeCalculationCommand(parameter);
508
+
509
+ }
510
+
511
+ }
512
+
513
+ }
514
+
515
+ ```
516
+
517
+ 2-7 Model.cs
518
+
519
+ ```C#言語
520
+
521
+ namespace WpfMVVMPrism
522
+
523
+ {
524
+
525
+ public class Model
526
+
527
+ {
528
+
529
+ public int a_val;
530
+
531
+ public int b_val;
532
+
533
+ public int c_val;
534
+
535
+
536
+
537
+ public int SumAB()
538
+
539
+ {
540
+
541
+ return c_val = a_val + b_val;
542
+
543
+ }
544
+
545
+ }
546
+
547
+ }
548
+
549
+ ```
550
+
551
+ 以上です。

2

コードを追加

2017/05/06 20:16

投稿

maroaig
maroaig

スコア14

test CHANGED
File without changes
test CHANGED
File without changes

1

イメージ図を作成して見ました

2017/05/06 20:14

投稿

maroaig
maroaig

スコア14

test CHANGED
File without changes
test CHANGED
@@ -9,6 +9,10 @@
9
9
 
10
10
 
11
11
  「テキストボックスにそれぞれ、ある数Aとある数Bを入力し、ボタンを押すとラベルに結果を表示する。」
12
+
13
+
14
+
15
+ ![イメージ説明](013b443c3072443e6b7f6257ac679943.jpeg)
12
16
 
13
17
 
14
18