かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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>

めもめも。