###前提・実現したいこと
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}
以上です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/05 14:55
2017/05/06 02:17
2017/05/06 20:38