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>
めもめも。