Bind Command In WPF Using MVVM
Answer :
You can bind the Command property of the button to any property that returns ICommand. Prism implements a nice convenient command called DelegateCommand that is very easy to use (here is a knock-off of it):
public ICommand MyButtonClickCommand { get { return new DelegateCommand<object>(FuncToCall, FuncToEvaluate); } } private void FuncToCall(object context) { //this is called when the button is clicked } private bool FuncToEvaluate(object context) { //this is called to evaluate whether FuncToCall can be called //for example you can return true or false based on some validation logic return true; } <Button x:Name="myButton" Command="{Binding MyButtonClickCommand}" />
The CodeProject example How to use Commands in WPF has a very similar example with code that you can easily work through. The previous Stack Overflow question has an example using RoutedCommands that are statically bound to: How to bind Close command to a button, and How to bind WPF button to a command in ViewModelBase? has a slightly more advanced example.
Seeing a lot of answers implementing this ICommand interface, I suggest a simpler option, which is to use the built in System.Windows.Input
Here's an example:
Xaml View:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="SomeDialog" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterOwner" ResizeMode="CanResizeWithGrip"> <StackPanel> <Button Width="Auto" Command="{Binding ClearCommand}" Content="Clear"/> </StackPanel> </Window>
View Code behind:
using System.Windows; public partial class SomeDialog : Window { public SomeDialog() { var vm = new ViewModel(); DataContext = vm; CommandBindings.AddRange(vm.Commands); InitializeComponent(); } }
View model:
using System.Windows.Input; public class ViewModel : ViewModelBase { readonly CommandBindingCollection commands = new CommandBindingCollection(); public static RoutedUICommand ClearCommand { get; set; } = new RoutedUICommand("Clear", "ClearCommand", typeof(ErrorDialog)); public CommandBindingCollection Commands { get { commands.Add(new CommandBinding(ClearCommand, OnClearExecuted); return commands; } } void OnClearExecuted(object sender, ExecutedRoutedEventArgs e) { view.DialogResult = true; //Indicate things view.Close(); //Close the window } }
Call like this:
public void OpenSomeDialog() { var dialog = new SomeDialog() {Owner = Application.Current.MainWindow}; bool? b = dialog.ShowDialog(); if (b != null && (bool) b) //Do things }
Now go dialog things.
Comments
Post a Comment