using System.Windows.Input;
namespace HQ.Wpf.Util.Command
{
public class StandardCommand
{
public static RoutedUICommand PinPropertyGrid = new RoutedUICommand("Pin property grid", "PinPropertyGrid", typeof(StandardCommand));
public MainWindowViewModel()
{
CommandPinPropertyGrid = new DelegateCommand<bool>(PinPropertyGrid);
型 ...
// ******************************************************************
public DelegateCommand<bool> CommandPinPropertyGrid { get; private set; }
public void PinPropertyGrid(bool pinned)
{
this.IsPropertyGridPinned = pinned;
}
型 DelegateCommand:
using System;
using System.Windows.Input;
namespace HQ.Wpf.Util.Command
{
/// <summary>
/// Represents a command that forwards the <c>Execute</c> and <c>CanExecute</c> calls to specified delegates.
/// </summary>
public class DelegateCommand<T> : ICommand
{
private readonly Action<T> _executeCallback;
private readonly Predicate<T> _canExecuteCallback;
/////////////////////////////////////////////////////////////////////////////////////////////////////
// OBJECT
/////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a new instance of the <see cref="DelegateCommand<T>"/> class.
/// </summary>
/// <param name="executeCallback">The execute callback delegate.</param>
public DelegateCommand(Action<T> executeCallback)
: this(executeCallback, null)
{
// No-op
}
/// <summary>
/// Initializes a new instance of the <see cref="DelegateCommand<T>"/> class.
/// </summary>
/// <param name="executeCallback">The execute callback delegate.</param>
/// <param name="canExecuteCallback">The can execute callback delegate.</param>
public DelegateCommand(Action<T> executeCallback, Predicate<T> canExecuteCallback)
{
if (executeCallback == null)
throw new ArgumentNullException("executeCallback");
this._executeCallback = executeCallback;
this._canExecuteCallback = canExecuteCallback;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// INTERFACE IMPLEMENTATION
/////////////////////////////////////////////////////////////////////////////////////////////////////
#region ICommand Members
/// <summary>
/// Defines the method that determines whether the command can execute in its current state.
/// </summary>
/// <param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null"/>.</param>
/// <returns>
/// <c>true</c> if this command can be executed; otherwise, <c>false</c>.
/// </returns>
public bool CanExecute(object parameter)
{
return (this._canExecuteCallback == null) ? true : this._canExecuteCallback((T)parameter);
}
/// <summary>
/// Occurs when changes occur that affect whether or not the command should execute.
/// </summary>
public event EventHandler CanExecuteChanged
{
add
{
if (this._canExecuteCallback != null)
CommandManager.RequerySuggested += value;
}
remove
{
if (this._canExecuteCallback != null)
CommandManager.RequerySuggested -= value;
}
}
/// <summary>
/// Defines the method to be called when the command is invoked.
/// </summary>
/// <param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null"/>.</param>
public void Execute(object parameter)
{
this._executeCallback((T)parameter);
}
#endregion // ICommand Members
}
}
6条答案
按热度按时间smtd7mpg1#
字符串
9udxz4iz2#
如果你使用MVVM,你可以像这样使用事件触发器:
字符串
whhtz7ly3#
它能满足你的要求-
字符串
evrscar24#
System.Windows.Interactivity
添加到项目引用中。xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
添加到XAML命名空间。字符串
我在ViewModel上实现
INotifyPropertyChanged
,如下所示:型
我的ViewModel的
SomeBoolProperty
看起来像这样:型
我在这里使用RelayCommand作为我的命令实现https://stackoverflow.com/a/22286816/336753。
我的ViewModel上的命令看起来像这样:
型
我得到了这个问题,试图找到一种方法来重用我已经在我的ViewModel上的两个命令。一个在选中时调用,一个在未选中时调用。我也在一些按钮上使用它们,所以不想添加额外的参数化命令。人们在这里询问ViewModel实现,所以添加这个答案来完成Igor_S的一个。希望它有帮助。
cgfeq70w5#
我迟到了.我用Rohit Vats的答案,想出了这个代码。
这个例子是一个工作代码提取,它只是在这里帮助理解每个方面。它是一个图钉,可以是活动的或不活动的,它使用DelegateCommand。你可能也可以使用RelayCommand或任何其他类似的类来做同样的工作。
命令:
字符串
Xaml:
型
产品型号:
型
...
型
DelegateCommand:
型
ujv3wf0j6#
当你只需要复选框的状态(选中或未选中)时,你不需要参数。当你使用这个代码时,你可以检测复选框的状态:
字符串
“e”是命令中的ExecutedRoutedEventArgs-Parameter。您需要box. Isalog.Value,因为box. Isalog来自类型bool?。