かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

MVVMパターンでVMからVに通知する方法

2010/09/22 追記
多分えムナウさんの言ってた方法はid:griefworkerさんのやり方のほうが正しいです。「MVVM パターンで ViewModel から Viewを操作する方法


えムナウさんのページで以下のような方法が紹介されていました。

上記から引用
MVVM パターンで VM から VIEW を操作するには、VIEW に RoutedUICommnad か ICommand を実装することを推奨する。


こんな感じのことかなぁ?

// ViewModel

namespace WpfApplication11
{
    using System.Windows.Input;
    using Microsoft.Expression.Interactivity.Core;

    public class MainWindowViewModel
    {
        public RoutedCommand HelloViewCommand { get; set; }

        public ICommand AlertCommand { get; private set; }

        public MainWindowViewModel()
        {
            this.AlertCommand = new ActionCommand(() =>
            {
                // ViewをCommandを介して操作(本当はCanExecuteもしないといけないかな)
                this.HelloViewCommand.Execute(null, null);
            });
        }
    }
}

View側はこんな感じかな

namespace WpfApplication11
{
    using System.Windows;
    using System.Windows.Input;

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public static readonly RoutedCommand HelloViewCommand = new RoutedCommand("HelloView", typeof(MainWindow));

        public MainWindow()
        {
            InitializeComponent();
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("Hello world");
        }
    }
}
<Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication11"
        Title="MainWindow" Height="350" Width="525">
    <Window.CommandBindings>
        <CommandBinding Command="{x:Static local:MainWindow.HelloViewCommand}" Executed="CommandBinding_Executed" />
    </Window.CommandBindings>
    <Window.DataContext>
        <local:MainWindowViewModel HelloViewCommand="{x:Static local:MainWindow.HelloViewCommand}" />
    </Window.DataContext>
    <Grid>
        <Button Content="Hello world" Command="{Binding Path=AlertCommand}"/>
    </Grid>
</Window>

めもめも。