gpt4 book ai didi

wpf - 使用 InvokeDelegateCommandAction 的事件触发器的 CommandParameter

转载 作者:行者123 更新时间:2023-12-03 10:21:56 25 4
gpt4 key购买 nike

我正在使用来自 AlexeyZakharov's weblog 的类 InvokeDelegateCommandAction根据一些人的建议,这是将参数从 View 发送回 EventTrigger 的 ViewModel 的最佳方式。

这就是我所拥有的。

在 View 中(具体来说是一个 DataGrid):

<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged" >
<cmnwin:InvokeDelegateCommandAction
Command="{Binding SelectedExcludedItemChangedCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource self}, Path=SelectedItems}" />
</i:EventTrigger>
</i:Interaction.Triggers>

在 View 模型中:
public DelegateCommandWithParameter SelectedActiveItemChangedCommand
{
get
{
return selectedActiveItemChangedCommand ??
(selectedActiveItemChangedCommand = new DelegateCommandWithParameter(DoSelectedActiveItemsChanged, CanDoSelectedActiveItemsChanged));
}
}

public bool CanDoSelectedActiveItemsChanged(object param)
{
return true;
}

public void DoSelectedActiveItemsChanged(object param)
{
if (param != null && param is List<Object>)
{
var List = param as List<Object>;
MyLocalField = List;
}
}

允许我将对象作为 args 传递的新型 DelegateCommand:
public class DelegateCommandWithParameter : ICommand
{
#region Private Fields
private Func<object, bool> canExecute;
private Action<object> executeAction;
private bool canExecuteCache;
#endregion

#region Constructor
public DelegateCommandWithParameter(Action<object> executeAction, Func<object, bool> canExecute)
{
this.executeAction = executeAction;
this.canExecute = canExecute;
}
#endregion

#region ICommand Members
public bool CanExecute(object parameter)
{
bool temp = canExecute(parameter);
if (canExecuteCache != temp)
{
canExecuteCache = temp;
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, new EventArgs());
}
}
return canExecuteCache;
}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
executeAction(parameter);
}
#endregion
}

每当我的代码到达 DoSelectedActiveItemsChanged 时,arg 始终为 NULL....我在这里完全是个傻瓜吗? CommandParamter 在哪里链接到命令参数? AKA,为什么 View 没有将任何内容传递回命令?请帮忙。

最佳答案

我用 ListBox 代替了它,但我得到了同样的东西。以下很好,因为它传递 CommandParameter 而不是调用参数。那么为什么是 CommandParameter null 呢?

protected override void Invoke( object parameter ) {
this.InvokeParameter = parameter;

if ( this.AssociatedObject != null ) {
ICommand command = this.ResolveCommand();
if ( ( command != null ) && command.CanExecute( this.CommandParameter ) ) {
command.Execute( this.CommandParameter );
}
}
}
CommandParameter 似乎无法正常工作,因为您的绑定(bind)将其设置为 null{RelativeSource Self} 解析为 InvokeDelegateCommandAction ,并且没有 SelectedItems 属性。相反,使用此绑定(bind):
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=SelectedItems}"

然后 CommandParameter 将从 SelectedItemCollection 传入一个 ListBox

您会很快发现另一个问题。 DoSelectedActiveItemsChanged()param 将是 SelectedItemCollection 的实例,而不是 List<Object>

关于wpf - 使用 InvokeDelegateCommandAction 的事件触发器的 CommandParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com