Привязать к CheckBox и выполнить команду способом MVVM - PullRequest
2 голосов
/ 08 октября 2010

У меня есть вопрос, похожий на этот , но в более подробной ситуации. Я также пытаюсь реализовать решение, используя шаблон View View модели Model View.

В MainView у меня есть кнопка, которая вызывает команду (мы назовем ее Execute), хранящаяся в MainViewModel. Я также хочу, чтобы эта команда вызывалась при нажатии левой кнопки мыши (на самом деле, только на Up), но только при проверке MouseUpCheckBox.

Когда у меня был весь код в представлении, я сделал статическую привязку для Execute, но затем использовал ElementName привязку к Window (с именем w_window) для IsChecked и проверил значение свойства в обработчик MouseLeftButtonUpEvent.

XAML

<Button Command="{x:Static local:MainView.Execute}">
    Execute
</Button>
<CheckBox IsChecked="{Binding ElementName=w_window, Path=ExecuteOnMouseUp}">
    Execute on Mouse Up
</CheckBox>

C #

public MainView()
{
    InitializeComponent();
    this.CommandBindings.Add(new CommandBinding(Execute, ExecuteExecuted));
    MyDesigner.AddHandler(UIElement.MouseLeftButtonUpEvent, new RoutedEventHandler((o, eventArgs) =>
    {
        if (ExecuteOnMouseUp)
        {
            Execute.Execute(null, this);
        }
    }), true);
}

#region ExecuteOnMouseUp
/// <summary>
/// ExecuteOnMouseUp Dependency Property
/// </summary>
public static readonly DependencyProperty ExecuteOnMouseUpProperty =
    DependencyProperty.Register("ExecuteOnMouseUp", typeof(bool), typeof(MainView),
        new FrameworkPropertyMetadata((bool)false));

/// <summary>
/// Gets or sets the ExecuteOnMouseUp property. This dependency property 
/// indicates ....
/// </summary>
public bool ExecuteOnMouseUp
{
    get { return (bool)GetValue(ExecuteOnMouseUpProperty); }
    set { SetValue(ExecuteOnMouseUpProperty, value); }
}
#endregion

#region Execute
/// <summary>
/// The Execute command ....
/// </summary>
public static RoutedUICommand Execute
    = new RoutedUICommand("Execute", "Execute", typeof(MainView));

private void ExecuteExecuted(object sender, ExecutedRoutedEventArgs e)
{
    ...
}
#endregion

Как я могу перенести этот код из моего представления в модель представления? Должен ли я использовать прикрепленное свойство? Есть ли способ привязать значение флажка к параметру в Command или, возможно, в обработчике CanExecute? Какой идиоматический способ работы с WPF / MVVM в подобных ситуациях?

Ответы [ 3 ]

2 голосов
/ 08 октября 2010

Оформить эту статью.Он показывает вам, как создать AttachedCommand, который позволит вам выполнить то, что вы пытаетесь сделать.

0 голосов
/ 15 августа 2013

Рэйчел предоставила очень хорошее решение выше, но в целях понимания я привожу ниже детали другого подхода, который она упомянула (спасибо снова @Rachel).

<...
 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
...>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="ExecuteOnMouseUp">
        <i:InvokeCommandAction Command="{Binding Execute}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

Я попробовал оба и нашел некоторые различия в обработке перенаправленных событий. Но в целом оба метода работают как шарм.

0 голосов
/ 10 октября 2010

На мой взгляд, ваш пример выглядит слишком сложным для такой простой задачи, как привязка к кнопке или CheckBox.

Вы можете взглянуть на ViewModel пример приложения WPF Application Framework (WAF) . Он показывает, как вы можете привязать свойство IsChecked к ViewModel дружественным способом MVVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...