2

ICommandからイベントに を追加するにはどうすればよいFrameworkElementですか?

具体的には以下のことをしたい

<ListView> <!-- Button, Windows or whatever element -->
    <my:EventToCommand 
        Name="PreviewMouseLeftButton"
        Command="{Binding Path=MyCommand}"
        CommandParameter="{Binding ...}" />
    <!-- Value, Element, etc.. -->
</ListView>

教育目的で独自のソリューションを実装したいのですが、サードパーティのライブラリ (MVVM Light、Prism など) を使用したくありません。

4

1 に答える 1

5

アタッチされた動作を使用する必要があります。デモンストレーションの目的で、MVVM と ICommand パターンを使用してボタンのダブルクリックを実装したいとします。関連するコードは次のとおりです。

まず、次のような ButtonBehaviors という静的クラスを作成します。

public static class ButtonBehaviors
{
    public static object GetButtonDoubleClick(DependencyObject obj)
    {
        return obj.GetValue(ButtonDoubleClickProperty);
    }

    public static void SetButtonDoubleClick(DependencyObject obj, object value)
    {
        obj.SetValue(ButtonDoubleClickProperty, value);
    }

    public static readonly DependencyProperty ButtonDoubleClickProperty =
        DependencyProperty.RegisterAttached("ButtonDoubleClick", typeof (object), typeof (ButtonBehaviors),
                                            new UIPropertyMetadata(new PropertyChangedCallback(OnButtonDoubleClickChanged)));

    private static void OnButtonDoubleClickChanged (DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var button = d as Button;
        if(button == null)
        {
            return;
        }

        var command = e.NewValue as ICommand;
        if(command == null)
        {
            return;
        }

        button.MouseDoubleClick += (o, ev) => command.Execute(button);
    }
}

(1秒で説明します)

次に、これを使用する方法は次のとおりです。

MainWindow.xaml:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication3="clr-namespace:WpfApplication3" Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" 
                Height="23" 
                HorizontalAlignment="Left" 
                Margin="173,89,0,0" 
                VerticalAlignment="Top" 
                WpfApplication3:ButtonBehaviors.ButtonDoubleClick="{Binding ButtonDoubleClick}"
                Width="75" />
    </Grid>
</Window>

最後に、ViewModel:

public class ViewModel
{
    private ICommand _buttonDoubeClick;

    public ICommand ButtonDoubleClick
    {
        get
        {
            if (_buttonDoubeClick == null)
            {
                _buttonDoubeClick = new SimpleDelegateCommand(() => MessageBox.Show("Double click!!"));
            }

            return _buttonDoubeClick;
        }
    }
}

完全を期すために、サードパーティのdllはここにないと言ったので、私のSimpleDelegateCommandは次のとおりです。

public class SimpleDelegateCommand : ICommand
{
    private readonly Action _action;

    public SimpleDelegateCommand(Action action)
    {
        _action = action;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        if(_action != null)
        {
            _action();
        }
    }
}

何が起こっているかを簡単に言うと、Command を添付プロパティに割り当てると、OnButtonDoubleClickChanged イベントが発生し、その時点で button.MouseDoubleClick イベントに接続します。

于 2012-07-25T14:27:03.407 に答える