質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Q&A

5回答

20913閲覧

C#を使用したMVVMの基本について

maroaig

総合スコア14

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

0グッド

2クリップ

投稿2017/05/05 07:26

編集2017/05/09 06:12

###前提・実現したいこと
MVVMで、Web検索しますと、複数の解釈とコード例が検索されますが、基本的な例が見つかりません。
そこで、MS社の資料を参考にC# Prism Unityで、MVVM構造の単純なプログラムを作成しました。

<作成内容>
「各テキストボックスに、ある数Aとある数Bを入力し、ボタンを押すとラベルに結果を表示する。」

イメージ説明

<課題>
素直に、そのまま作りますと、只の足し算が信じられない複雑なプログラムになりました。
簡単なプログラムにする良い方法を検討しています。

###ここに質問したいことを詳細に書いてください

C# Prism Unityで、MVVM構造プログラムを作成する場合、定石的な方法で、簡単なコードをご教授下さい。

###該当のソースコード

マイクロソフト社の解説書
CompositeWPF-June2008-JA-JP.chm
MVVM関連
https://www.microsoft.com/ja-JP/download/details.aspx?id=39042

(複雑になった基本プログラム)
イメージ説明

1.準備
VisualStudioCommunity2015
wpfアプリケーションのプロジェクト
NuGetパッケージ管理より
Prism、Prism.Unitをインストール

2.Composite Application Libraryを学ぶ
2-1 App.XAML

XAML言語

1<Application x:Class="WpfMVVMPrism.App" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:local="clr-namespace:WpfMVVMPrism" 5 Startup ="Application_Startup"> 6 <Application.Resources> 7 </Application.Resources> 8</Application>

2-2 App.XAML.cs

C#言語

1using System.Windows; 2namespace WpfMVVMPrism 3{ 4 /// <summary> 5 /// App.xaml の相互作用ロジック 6 /// </summary> 7 public partial class App : Application 8 { 9 private void Application_Startup(object sender, StartupEventArgs e) 10 { 11 var boot = new Bootstrap(); 12 boot.Run(); 13 } 14 } 15}

2-3 Bootstrap.cs Shellをコンテナに登録(最小コード)

C#言語

1using System.Windows; 2using Microsoft.Practices.Unity; 3using Prism.Mvvm; 4namespace WpfMVVMPrism 5{ 6 /// <summary> 7 /// Unity コンテナーを使用する。 8 /// </summary> 9 public class Bootstrap : Prism.Unity.UnityBootstrapper 10 { 11 protected override DependencyObject CreateShell() 12 { 13 return this.Container.Resolve<Shell>(); 14 } 15 16 protected override void InitializeShell() 17 { 18 ViewModelLocator.SetAutoWireViewModel(this.Shell, true); 19 ((Shell)this.Shell).Show(); 20 } 21 } 22}

2-4 Shell.XAML

XAML言語

1<Window 2 x:Class="WpfMVVMPrism.Shell" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:WpfMVVMPrism" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 Title="MVVMの基本その1(計算 A+B=C)" 9 Width="350" 10 Height="200" 11 mc:Ignorable="d"> 12 13 <!-- <Window.DataContext> 14 <local:ViewModel /> 15 </Window.DataContext> --> 16 17 <Grid> 18 <Grid.ColumnDefinitions> 19 <ColumnDefinition /> 20 </Grid.ColumnDefinitions> 21 22 <Grid.RowDefinitions> 23 <RowDefinition /> 24 <RowDefinition /> 25 <RowDefinition /> 26 <RowDefinition /> 27 </Grid.RowDefinitions> 28 <TextBox 29 x:Name="textBoxA" 30 Grid.Row="0" 31 Text="{Binding DataA}" /> 32 <TextBox 33 x:Name="textBoxB" 34 Grid.Row="1" 35 Text="{Binding DataB}" /> 36 <Button 37 x:Name="button" 38 Grid.Row="2" 39 Content="「A+B=C」の計算をする" 40 Command="{Binding CalculationCommand}"/> 41 <Label 42 x:Name="labelC" 43 Grid.Row="3" 44 Content="{Binding ResultC}" /> 45 </Grid> 46</Window>

2-5 Shell.XAML.CS

C#言語

1using System.Windows; 2namespace WpfMVVMPrism 3{ 4 /// <summary> 5 /// Shell.xaml の相互作用ロジック 6 /// </summary> 7 public partial class Shell : Window 8 { 9 public Shell() 10 { 11 InitializeComponent(); 12 this.DataContext = new ViewModel(); 13 } 14 } 15}

2-6 VeiwModel.cs

C#言語

1using System; 2using System.ComponentModel; 3using System.Windows.Input; 4namespace WpfMVVMPrism 5{ 6 public class ViewModel : INotifyPropertyChanged 7 { 8 public int DataA { get; set; } 9 public int DataB { get; set; } 10 11 public event PropertyChangedEventHandler PropertyChanged; 12 private int _resultC; 13 public int ResultC 14 { 15 get 16 { 17 return _resultC; 18 } 19 set 20 { 21 _resultC = value; 22 OnPropertyChanged("ResultC"); 23 } 24 } 25 26 protected void OnPropertyChanged(string name) 27 { 28 PropertyChangedEventHandler handler = PropertyChanged; 29 if (handler != null) 30 { 31 handler(this, new PropertyChangedEventArgs(name)); 32 } 33 } 34 35 private ICommand _calculationCommand; 36 public ICommand CalculationCommand 37 { 38 get 39 { 40 if (_calculationCommand == null) 41 { 42 _calculationCommand = new RelayCommand(ExecuteCalculationCommand); 43 } 44 return _calculationCommand; 45 } 46 } 47 48 private void ExecuteCalculationCommand(object x) 49 { 50 Model m = new Model(); 51 m.a_val = DataA; 52 m.b_val = DataB; 53 ResultC = m.SumAB(); 54 } 55 } 56 57 internal class RelayCommand : ICommand 58 { 59 private Action<object> executeCalculationCommand; 60 61 public RelayCommand(Action<object> executeCalculationCommand) 62 { 63 this.executeCalculationCommand = executeCalculationCommand; 64 } 65 66 public event EventHandler CanExecuteChanged; 67 68 public bool CanExecute(object parameter) 69 { 70 return true; 71 } 72 73 public void Execute(object parameter) 74 { 75 this.executeCalculationCommand(parameter); 76 } 77 } 78}

2-7 Model.cs

C#言語

1namespace WpfMVVMPrism 2{ 3 public class Model 4 { 5 public int a_val; 6 public int b_val; 7 public int c_val; 8 9 public int SumAB() 10 { 11 return c_val = a_val + b_val; 12 } 13 } 14}

以上です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

まあ、足し算のみで使うのはオーバースペックでしょうね。

http://qiita.com/hiki_neet_p/items/e381c687b0644c0e4978
の例では、肥大化しているのは非同期処理を書いている部分です。
巨大な非同期処理のコードの中に足し算の処理がまみれてしまうのを避け、Modelに分けることでビジネスロジックをスッキリさせています。

それこそ大企業向け(別に中小でも構わない)の複雑なビジネスモデルと記述するのに、レイヤー化された開発モデルは大規模開発の際に分業をしやすくします。

あと、工数が増える一切の作業はするべきではありません。システムは効率化のために使いましょう。
足し算にMVVMモデルを使うのはそういう意味で間違いで、電卓を渡すのが正解でしょう。適切な例が大規模になりすぎる場合があります。それはそれと考えるのが適切だと思います。

また、いろいろなアーキテクチャがありますが、基本的にはModelにビジネスロジックを集中させ、入出力を分けるのが一般的です。オブジェクト指向を機能させたり、自動化されたユニットテストをするためのほとんど必須の要件だからです。

MSDNの説明はわかりにくいものも多くありますが、サンプルコードもあり、他のモデルを理解している人には理解出来るものと思われます。私の場合、理解しづらい場合は入門書のようなものに当たってから見るようにしています。

投稿2017/05/05 13:22

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maroaig

2017/05/05 14:55

ご回答有難うございます。MVVMを実現する為に、工数を使うメリットがあるのか?議論の余地がありますよね。従来MSが推奨していた方式で短納期で作成する。もう過去でしょうか?ユニットテストも、分業もMVVMが必要とは限りません。工夫次第ですよね。私の場合はMVVMをパターン化し、最小工数で作れれば、合理的な作成方法と信じているのですが、技術的に直観的でなく使いにくいとも思ってます。 「入門書」?、MVVMを現場で使いたいと思う程、納得してません。従来よりも大変な作業になると思うのみです。私は、勉強不足なのでしょう。少しコードを書いてMVVM+Prismに慣れるようにしたいと思います。ご意見有難うございました。お仕事頑張って下さい。
iwamoto_takaaki

2017/05/06 02:17

質問と思われる場所に回答します。いちいち答えすぎかもしれませんが悪気はありません。 >MVVMを実現する為に、工数を使うメリットがあるのか?議論の余地がありますよね。 それは個々の条件によるものですし、メリット・デメリットの重づけは主観によるところもあります。(メリット・デメリットは議論可能ですが・・・) プロジェクトの現在・将来の状況に合わせての判断なので、プロジェクトメンバーならともかく私は議論に参加できません。 >従来MSが推奨していた方式で短納期で作成する。もう過去でしょうか? これは引用でしょうか?だとしたら、なんの引用でしょうか?文脈がわからず回答できません。 >ユニットテストも、分業もMVVMが必要とは限りません。工夫次第ですよね。 そうです。ほかの方法でも良いです。工夫の仕方としてModelを分離するというのは一般的で優れた方法の一つだと思います。 >「入門書」?、MVVMを現場で使いたいと思う程、納得してません。 公式などでわかりずらい場合、導入の評価を行うには入門書(薄めのモノ)を読むのをお勧めします。短い時間で使い方のイメージをつかむことができます。現場で使うときは、もっと詳しい資料(厚めのモノ)にあたるといいと思います。
maroaig

2017/05/06 20:38

ご回答有難うございます。書籍も日本語に翻訳されるペースが、追いつかない状態ではと感じます。英文を読まなければ仕事にならない時代になりました。パソコンの翻訳機能が頼りです。 MVVM入門では http://www.atmarkit.co.jp/ait/articles/1011/09/news102.html このURLは、分かり易いと思いました。
guest

0

例えばテキストエディタを開発するとします。
最初の要件では TextBox を使い、ファイルのロードやセーブ・検索・置換などの機能を Form のメソッドとして持たせることになりました。

しかし、このエディタに思わぬ人気が出て、ユーザーから様々な要望が寄せられるようになりました。そこで開発陣はそれに応えるために TextBox をやめて AvalonEdit を使うことになり、Form は Window に変え、一から全部書き直しました。

こういう開発の仕方もあります。しかし、アプリケーションの規模が大きくなればなるほどフルスクラッチで書き直すことの負担は大きくなるでしょう。

MVVM で開発する時は、最初に View として TextBox と Form を選びます。そしてテキストエディタとして必要な振舞い(ロード・セーブ・検索・置換など)を Model として実装し、その両者をつなぐために ViewModel を書きます。Model はとにかくテキストエディタとしてこう振舞うべきという理想を追求します。ここで、TextBox および Form を開発するマイクロソフトと、Model を開発する班とで完全な分業が行われます。どちらも互いに依存していません。

さて View を AvalonEdit と Window に変えました。この時、書き直すべきは ViewModel だけです。しかし、View も Model もできているので、それらを部品として組み立てていくだけの作業であり、最初からフルスクラッチで書くのとは仕事量が大きく違います。

アプリケーションのすべてを自分で開発するのであれば、MVVM はもしかしたら無用なのかもしれません。しかし、他社の開発した部品を使うのであれば、そのバージョンアップや採用状況に合わせて柔軟に対応しなければなりません。この時、アプリケーションのソースすべてがその部品に依存していたとしたら、全部書き直さなければなりませんが、可能な限り分離することで書き直さなければならない範囲を大きく削減することができます。

投稿2017/05/06 01:38

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maroaig

2017/05/06 03:14

Zuishinさん、こんにちは、MVVMを使うと、仕様変更に対応し易い。これは心から本当にそう思えますか、私は、Prismを使って、MVVMを作るのも大変、細かく分解されたソースから処理を追うのも一苦労しています。手続き型というより、関数型の処理になってます。昔流で言いますと、関数イベントの乱打、goto文のマカロニスパゲッティ状態です。この疎結合状態であるので、ある機能を交換しても、大丈夫、イベントを繋ぎ直す手間で交換できます。この理論は分かりますが、私は、その作業、ストラクチャ方式より、難解と思えます。Prismメッソッドの組み合わせ動作に慣れるのが、一苦労ではなかったでしょうか?従来方式より、改善されましたか?
Zuishin

2017/05/06 03:16

誰が作ったかにもよります。スパゲッティをゆでる人は何でもスパゲッティにします。
Zuishin

2017/05/06 03:22

たとえばデータベースアプリケーションであれば、DataGridView が View です。Entity が Model です。それをつなぐあなたのコードが ViewModel です。どこかわかりにくいですか? Model を作らず、ソースのあちこちで SQL を使う方法も確かにあります。こちらの方がわかりやすいですか?
maroaig

2017/05/06 21:29

ご回答有難うございます。最近は、DataGridViewなどは、Unitテストができないからダメだそうです。これも、カスタムクラスを作ります。私は、DataGridViewはそのまま使う主義でしたので、内部クラスの関係がどうなっているのか辛いです。兎に角、芸が細かいのです。Entityフレームワークも、Oracle用に、カスタムクラスを作ります。データのキャッシュクラスも作ってます。
Zuishin

2017/05/06 22:49

一例です。まだ複雑過ぎますか?噛み砕くのも限界がありますが。
Zuishin

2017/05/06 23:02 編集

足し算をモデルにしているのも一例ですよ。普通こんなものをモデルに分ける人なんかいません。これをもって複雑だ複雑だと騒ぐのはナンセンスです。 足し算だけするオブジェクトを作って、「オブジェクト指向は複雑だ。素直に足した方がわかりやすい」と騒いでいるようなものです。
ozwk

2017/05/07 00:43

足し算でさえこんなに複雑なコードなるんだから もっと複雑なモデルならもっと複雑なコードになるという考えなのでは?
Zuishin

2017/05/07 04:33

複雑にしようと思えばいくらでも複雑になりますけど、足し算モデルが複素数の四則演算と集合演算モデルになってもそんな変わらないんじゃないですか?
maroaig

2017/05/07 05:33

ViewModelとModelの関係ですか?、疎結合にしないと、インターフェース変更しないで、足し算モデル、複素数演算モデル、集合演算モデルなどに交換できるように、う~?
Zuishin

2017/05/07 05:38

誰もそんなこと言ってません。話がそれています。疑問が無いのなら自己解決でもしたらどうでしょう? 何か主張したいだけなら次回からは Qiita にでもどうぞ。
maroaig

2017/05/07 13:32

私には、良く理解できないのですが、コードを実用化したいと思っているだけです。問題が有るのでしょうか?ご教授よろしくお願いいたします。
guest

0

4 Model側をイベント処理化します。(モデルの疎結合化)
4-1 Shell.XAMLの追加修正

XAML

1<Window 2 x:Class="WpfMVVMPrism.Shell" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:WpfMVVMPrism" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 Title="MVVMの基本その2(計算 A+B=C,A*B=D)" 9 Width="350" 10 Height="200" 11 mc:Ignorable="d"> 12 13 <!-- <Window.DataContext> 14 <local:ViewModel /> 15 </Window.DataContext> --> 16 17 <Grid> 18 <Grid.ColumnDefinitions> 19 <ColumnDefinition /> 20 </Grid.ColumnDefinitions> 21 22 <Grid.RowDefinitions> 23 <RowDefinition /> 24 <RowDefinition /> 25 <RowDefinition /> 26 <RowDefinition /> 27 <RowDefinition /> 28 </Grid.RowDefinitions> 29 <TextBox 30 x:Name="textBoxA" 31 Grid.Row="0" 32 Text="{Binding DataA}" /> 33 <TextBox 34 x:Name="textBoxB" 35 Grid.Row="1" 36 Text="{Binding DataB}" /> 37 <Button 38 x:Name="button" 39 Grid.Row="2" 40 Content="「A+B=C, A*B=D」の計算をする" 41 Command="{Binding CalculationCommand}"/> 42 <Label 43 x:Name="labelC" 44 Grid.Row="3" 45 Content="{Binding ResultC}" /> 46 <Label 47 x:Name="labelD" 48 Grid.Row="4" 49 Content="{Binding ResultD}" /> 50 </Grid> 51</Window>

4-2 ViewModel.cs の追加

C#

1using Microsoft.Practices.Prism.Commands; 2using Microsoft.Practices.Prism.Mvvm; 3using Prism.Events; 4using System; 5namespace WpfMVVMPrism 6{ 7 public class Addition : PubSubEvent<Tuple<int, int, Action<int>>> { } 8 public class Multiplication : PubSubEvent<Tuple<int, int, Action<int>>> { } 9 public class ViewModel : BindableBase 10 { 11 private EventAggregator events; 12 public int DataA { get; set; } 13 public int DataB { get; set; } 14 15 private int _resultC; 16 public int ResultC 17 { 18 get { return _resultC; } 19 set { this.SetProperty(ref this._resultC, value); } 20 } 21 22 private int _resultD; 23 public int ResultD 24 { 25 get { return _resultD; } 26 set { this.SetProperty(ref this._resultD, value); } 27 } 28 29 private DelegateCommand _calculationCommand; 30 public DelegateCommand CalculationCommand 31 { 32 get 33 { 34 if (_calculationCommand == null) 35 _calculationCommand = new DelegateCommand(ExecuteCalculationCommand); 36 return _calculationCommand; 37 } 38 } 39 40 public ViewModel() 41 { 42 this.events = new EventAggregator(); 43 var model = new Model(this.events); 44 } 45 46 private void ExecuteCalculationCommand() 47 { 48 ResultC = this.events.GetEvent<Addition>().CalData(DataA, DataB); 49 ResultD = this.events.GetEvent<Multiplication>().CalData(DataA, DataB); 50 } 51 } 52 53 static class lib 54 { 55 public static Result CalData<D1, D2, Result> 56 (this PubSubEvent<Tuple<D1, D2, Action<Result>>> @this 57 , D1 data1 58 , D2 data2) 59 { 60 Result ret = default(Result);// Null 61 Action<Result> CallBack = x => { ret = x; }; 62 @this.Publish(Tuple.Create(data1, data2, CallBack)); 63 return ret; 64 } 65 } 66}

4-3 Model.cs の追加

C#

1using System; 2using Prism.Events; 3namespace WpfMVVMPrism 4{ 5 public class Model 6 { 7 private EventAggregator events; 8 9 public Model(EventAggregator events) 10 { 11 this.events = events; 12 this.events.GetEvent<Addition>().Subscribe(SumAB, true); 13 this.events.GetEvent<Multiplication>().Subscribe(MultiplicationAB, true); 14 } 15 16 private void SumAB(Tuple<int, int, Action<int>> cal) 17 { 18 var ans = cal.Item1 + cal.Item2; 19 var CallBack = cal.Item3; 20 CallBack(ans); 21 } 22 23 private void MultiplicationAB(Tuple<int, int, Action<int>> cal) 24 { 25 var ans = cal.Item1 * cal.Item2; 26 var CallBack = cal.Item3; 27 CallBack(ans); 28 } 29 } 30}

この方式ですと、複雑で良い方法とは思えないのです。明快な解決策は無いでしょうか?

投稿2017/05/07 13:24

maroaig

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2017/05/08 05:24

MVVMインフラの中では、Prism はプレーンに近いです。 最終的に Prism をベースにインフラを構築するのは良いのですが、その前に MVVM Light と Livet の両方を使って見ることをお勧めします。 目から鱗が幾つか落ちると思います。
maroaig

2017/05/08 08:50

ご教授有難うございます。「MVVM入門その4ライブラリを使おう」MSにお勤めのかずきさんのご紹介例を見てますが、https://code.msdn.microsoft.com/windowsdesktop/MVVM-0675495f 私としては、「簡単になってるのかなぁ」と思うばかりで、hihijijiさんは、どの辺で、「目から鱗が」となったのでしょうか?
hihijiji

2017/05/08 08:54

その簡単にするやり方です。
maroaig

2017/05/08 15:16

簡単ですか?どの視点から考察するかが大事だと思います。たとえば、AIは簡単便利と言いましても、製作側から見れば、複雑だなぁとなります。また、自分で作る物は簡単に思え、他人が作ると複雑に見えますね。このライブラリも、プラモデルのように、設計図どうりに組み立てるユーザーであれば、簡単便利なツールの類ではと思います。
guest

0

3 検討結果
3-1 VeiwModel.csを実用的に改良する

C#

1using Microsoft.Practices.Prism.Commands; 2using Microsoft.Practices.Prism.Mvvm; 3namespace WpfMVVMPrism 4{ 5 public class ViewModel : BindableBase 6 { 7 public int DataA { get; set; } 8 public int DataB { get; set; } 9 10 private int _resultC; 11 public int ResultC 12 { 13 get 14 { 15 return _resultC; 16 } 17 set 18 { 19 this.SetProperty(ref this._resultC, value); 20 } 21 } 22 23 private DelegateCommand _calculationCommand; 24 public DelegateCommand CalculationCommand 25 { 26 get 27 { 28 if (_calculationCommand == null) 29 _calculationCommand = new DelegateCommand(ExecuteCalculationCommand); 30 return _calculationCommand; 31 } 32 } 33 34 private void ExecuteCalculationCommand() 35 { 36 Model m = new Model(); 37 m.a_val = DataA; 38 m.b_val = DataB; 39 ResultC = m.SumAB(); 40 } 41 } 42}

BindableBaseクラスを継承、ICommandをDelegateCommandに変更すると、作成の手間が減少しました。

投稿2017/05/07 05:08

編集2017/05/07 05:12
maroaig

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MVVMパターンでの情報のやり取りは実行時に行うもので、設計時の打ち合わせとは別ものであると考えております。

テキストボックスに入力できる数値の桁数は、View を設計するときに必要ですよね?
一桁なのか一万桁なのか分からなければ View を設計しようがないですから。
同様に、足し算などの固定的で単純な処理は View の設計に盛り込んでも問題ないと思います。
残念ながら XAML には四則演算がないので、VM で行わざるを得ませんが…

投稿2017/05/06 01:28

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maroaig

2017/05/06 02:47

hihijijiさん、おはようございます。どこかでお会いしたことが有るかもしれません。VBAがお得意では? さて、本題ですが、画面の設計での打ち合わせで、MVVMパターンが話題になるとすれば、画面のデザイナーと、プログラマーの作業を分離する手法ですね。Microsoft Expression Blendツールでインターフェースを作成する場合、テキストボックスの幅など見た目は大事ですが、桁数は、プログラマーにお任せでは無責任でしょうか?(テキストボックスは、横スクロールしますし) XAML言語ですが、Convertや、クラスのカスタマイズも、MVCパターンで、数値変換を良く見ます。 C#で数値演算するのですが、まるでXAML言語の拡張のようにも見えます。 XAMLのソースもオープンになってますから、MS社のみではなく、一般の人もクラスのカスタマイズできます。でも、私から見ますと、相当に難しいとおもいます。
hihijiji

2017/05/06 07:14

言い方を変えてもう一回書きます。 ・MVVMパターンを採用してもModel側の管轄下にある情報の全てを実行時にModelに問い合わせする必要はありません。 ・Model側の管轄下にある情報でも、実行前から分かっているものならView側の仕様に落とし込んでもいいのです。 もちろんそれによって仕様や実装が複雑になるのは本末転倒です。 PS. VBA は苦手です ^^; VBAは本家のフォーラムを中心に頻りに書き込みを行っていたことがありましたね。 本家のフォーラムは当時カテゴリの統廃合が活発だったので、VBAカテゴリの存続に危機感を覚えたが故の行動でした。 ---私が大昔に乱発した不出来なVBAアプリ群--- それらを含め今となっては黒歴史です。 忘れて頂けたら幸いです。
maroaig

2017/05/06 21:12

ご回答ありがとうございます。う~、設計パターンに縛られるのも嫌です。柔軟性も欲しいです。しかし、調和、バランスも、そのうち、AIが勝手に判断すると思います。VBA言語も、ファッション業界のように、昔のデザインを少しアレンジして、最新ファッションになる事もありますから。学生さんの教育用になど、注目されると思います。
hihijiji

2017/05/07 14:28

>設計パターンに縛られるのも嫌です。柔軟性も欲しいです。 設計パターン(MVVMパターン)を採用したいけど実装が複雑になるのは避けたいってことでは無かったのですか? MVVMパターンの解釈の仕方が、面倒くさい方に偏ってるみたいなので、もう少し柔軟に考えては?とアドバイスしているのですが?
maroaig

2017/05/07 23:45

おはようございます。ここ10年の、ソフトウェア製作の方向性は、クラスの疎結合、仕様変更に対応し易い構造を重視している様子です。MSでは、「patterns&practices」このチームが中心と思うのです。 Prism Library 5.0 for WPFの開発者向けガイドの参考文献 https://msdn.microsoft.com/en-us/library/gg405487(v=pandp.40).aspx 2008年頃に考案されたようで、日本の現場に反映されるのに、10年余り経過しています。私も「MVVMパターンの解釈の仕方が、面倒くさい方に偏ってるみたい」同じ気持ちです。 Prismを軽量にアレンジしたXXXライトというのも存在するらしいです。詳しくは知りません。 Unity Containerに、View、ViewModel, Modelを登録し管理する用にすれば、簡単になるのではと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問