概要
Windows foamアプリケーションではボタンクリック時の処置はボタンクリックイベント内に記載します。
WPFでもクリックイベントを設定できますが、MVVM的にはCommadを用いて疎結合を行うのが定石・・・なようです。
ボタンクリックイベントをコマンドとバインドする流れを大まかにまとめると・・・
- 1.コマンド用のクラス(Command_forWin2.cs)を作成。
- 2.ビューモデル(ViewModel_forWin2.cs)でコマンド用クラスのインスタンスを作成
- 3.ビュー(Window2.xaml)でButtonのCommandプロパティに、ビューモデルでインスタンス化したコマンド用クラスをバインド
-
(ビュー内でDatacontextを設定しない場合は)
4.モデル(Window2.xaml.cs)でDatacontextを設定します。
※ 本コードは一応動いてはいますが、textboxへのバインドの仕方はアヤシイです。。。※
※ ご注意ください。※
「1.コマンド用のクラス(Command_forWin2.cs)を作成。」
では、
ICommandを継承して「CanExecuteChanged」「CanExecute」「Execute」を設定します。
「Execute」プロパティにクリック時の処置を記載します。
「2.ビューモデル(ViewModel_forWin2.cs)でコマンド用クラスのインスタンスを作成」
では、
コマンド用クラスをインスタンス化します。
※ 14行目
[public Command_forWin2 win2Command { get; private set; } = new Command_forWin2();]
それ以外に、本ソースではtextoxの値の変更通知のために「INotifyPropertyChanged」を継承しています。
ビュー、コード
ビュー XAML (Window2.xaml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<Window x:Class="CommandTest.Window2" 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:CommandTest" mc:Ignorable="d" Title="Window2" Height="169.703" Width="182.204"> <Grid> <Button x:Name="button" Content="Button" Command="{Binding win2Command}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="111" Height="22"/> <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="22" Margin="10,37,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="111" Text="{Binding TestBind, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> </Grid> </Window> |
コマンド (Command_forWin2.cs)
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 |
using System; using System.Windows.Input; namespace CommandTest { public class Command_forWin2: ICommand { // Window2のインスタンスを作成。 public Window2 win2; // ボタンクリック回数カウント用のプロパティ public int counter { get; set; } = 0; // 以下、ICommand用のプロパティ public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { // クリック時の処理を記載 counter += 1; win2.vm2.TestBind = $"Command Test {counter}"; } } } |
ビューモデル (ViewModel_forWin2.cs)
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 |
using System.ComponentModel; namespace CommandTest { public class ViewModel_forWin2 : INotifyPropertyChanged { // プロパティを変更すると通知が発生するようにPropertyChangedEventHandlerを設定 public event PropertyChangedEventHandler PropertyChanged; private void RisePropertyChanged(string propertyName) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public Command_forWin2 win2Command { get; private set; } = new Command_forWin2(); private string _TestBind { get; set; } public string TestBind { get { return _TestBind; } set { _TestBind = value; RisePropertyChanged(nameof(TestBind)); } } } } |
モデル (Window2.xaml.cs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Windows; namespace CommandTest { /// <summary> /// Window2.xaml の相互作用ロジック /// </summary> public partial class Window2 : Window { public ViewModel_forWin2 vm2 = new ViewModel_forWin2(); public Window2() { InitializeComponent(); vm2.win2Command.win2 = this; this.DataContext = vm2; } } } |
コメント