2013年4月7日日曜日

コマンドはゲッターとして実装するみたい

久々に使ってみるとかなり忘れてます...

コマンドについてメモです
"ボタンを押すとコマンドを実行して表示する"というプログラムを作ってみます

以前、メニューについて調べた際にもコマンドは使っていますが
内容についてはほとんど触れていませんでした

コマンドはデータバインドのゲッターとして実装し、
DelegateCommandのオブジェクトをreturnする模様です

newした際のdelegateは
- Execute
- CanExecute
となります

では実装してみます
例によってPrismを使っていますので
参照設定として "Microsoft.Practices.Prism"が必要になります

まずは例によって、ViewのDataContextにViewModelを設定します
namespace CommandTest_130407
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new MainWindowViewModel();
        }
    }
}


View側にはコントロールを配置します
<Window x:Class="CommandTest_130407.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="{Binding Text}" />
            <Button Command="{Binding ButtonCommand}" Content="押すとテキストが変わるよ!" />
        </StackPanel>
    </Grid>
</Window>


ViewModel側には
/**
 * ボタンを押すとカウントが上がるだけのプログラム
 *  '13.04.07
 *
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using Microsoft.Practices.Prism.ViewModel;
using Microsoft.Practices.Prism.Commands;   // 追加

namespace CommandTest_130407
{
    public class MainWindowViewModel : NotificationObject
    {
        int _count = 0;
        string _text;
        /// <summary>
        /// テキストのデータバインド
        /// </summary>
        public string Text
        {
            get { return _text; }
            set
            {
                _text = value;
                RaisePropertyChanged(() => Text);
            }
        }



        /// <summary>
        /// コマンドのデータバインド
        /// コマンドはデータバインドのゲッターとして実装するみたい
        /// </summary>        private DelegateCommand _buttonCommand;
        public DelegateCommand ButtonCommand
        {
            get
            {
                return _buttonCommand ?? (_buttonCommand = new DelegateCommand(
                    () =>
                    {   // Execute
                        _text = string.Format("ボタン押下 : {0}回目", ++_count);
                        RaisePropertyChanged(() => Text);
                    },
                    () =>
                    {   // CanExecute
                        return true;
                    }
                ));
            }
        }
    }
}

これでボタンを押すとテキストのカウントが上がるプログラムの実装ができました

0 件のコメント:

コメントを投稿