Henehefu 用 ウィキ

メニュー



- Views

最近の更新

取得中です。

WPFメモ > MVCのコントローラを分離してみるテスト


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

【むむむ】

Hogeクラスはどこかで定義済みってことで

ベースクラス

namespace Hoge.Controller
{
    public class ControllerBase<ModelClass>
    {
        public ControllerBase()
        {
            CommandList = new List<CommandBinding>();
        }
 
        public ModelClass Model
        {
            get;
            set;
        }
 
        public virtual void AddCommandTo(UIElement element)
        {
            element.CommandBindings.AddRange(CommandList);
        }
 
        protected List<CommandBinding> CommandList
        {
            get;
            set;
        }
    }
}
 
コントローラのベースクラスはジェネリックでモデルクラスを持つとしよう。

へろーコントローラクラス

namespace Filey.Controller
{
    public class HelloController : ControllerBase<Hoge>
    {
        public HelloController ()
        {
            var list = new[]{
                new CommandBinding(HelloCommand, Hello, CanHello),
                /* コマンドが続く */
            };
 
            CommandList.AddRange(list);
        }
 
        public static readonly ICommand HelloCommand =
            new RoutedCommand("HelloCommand", typeof(HelloController));
 
        private void Hello(object sender, ExecutedRoutedEventArgs e)
        {
            // ここに実行するコマンドを記述
            Model.Hello();
        }
 
        private void CanMove(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = Model.CanHello;
        }
 
        /* ほかのコマンドをずらずらと */
    }
}
 
たとえばウィンドウAとBで同じような動作(姫ちゃんに「やっほ^^」とか)をするのでその部分をコントローラに分離。
カートリッジのごとくビューにコントローラをはめ込む。
コントローラがビューを作るのと、ビューがコントローラを作るのはどっちがいいんだろうね?
それともそのビューとコントローラを管理する神クラス(じゃーまねークラス)でも作るか?

びゅー.cs

namespace Hoge.View
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private Hoge hoge;
        private void Window_Initialized(object sender, EventArgs e)
        {
            this.DataContext = hoge = new Hoge();
            var ctrHello = new HelloController();
            ctrHello.Model = hoge;
            ctrHello.AddCommandTo(this);
        }
    }
}
 
今回はビューがモデルとコントローラを作っちゃうよ。
コントローラベースクラスでコマンドバインディングの登録の委譲をさせてるのでAddCommandToで登録するじぇ。

ビュー.xaml

<Window x:Class="Hoge.View.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
    xmlns:ctr="clr-namespace:Hoge.Controller"
 
    Initialized="Window_Initialized"
 
    Title="あばばばばばばb" >
 
    <Grid>
        <Button Command="{x:Static ctr:HelloController.HelloCommand}">やっほ^^</Button>
    </Grid>
</Window>
ボタンにどのコマンドをやらせるかおしえる。


名前:
コメント:

すべてのコメントを見る

タグ一覧