У меня есть вопрос, похожий на этот , но в более подробной ситуации. Я также пытаюсь реализовать решение, используя шаблон 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 в подобных ситуациях?