相关疑难解决方法(0)

WPF - 如何强制命令通过其CommandBindings重新评估'CanExecute'

我有一个层次结构Menu中的每个MenuItem都将其Command属性设置为RoutedCommand我已定义的属性.关联CommandBinding提供了一个回调,用于评估CanExecute控制每个的启用状态MenuItem.

几乎可行.菜单项最初会显示正确的启用和禁用状态.但是,当我的CanExecute回调使用的数据发生变化时,我需要命令从我的回调中重新请求结果,以便在UI中反映这种新状态.

似乎没有任何公共方法RoutedCommandCommandBinding为此.

请注意,当我单击或键入控件时再次使用回调(我猜它是在输入时触发的,因为鼠标悬停不会导致刷新).

.net wpf command commandbinding

125
推荐指数
4
解决办法
8万
查看次数

CanExecute Logic for DelegateCommand

更新:焦点变成MVVM而不是实际问题,所以我正在更新它.

我有一个问题CanExecuteDelegateCommand.它在我打电话之前没有更新RaiseCanExecuteChanged,这是期望的行为吗?

在此输入图像描述

我在这里上传了一个简单的示例项目来重现这个问题:http://dl.dropbox.com/u/39657172/DelegateCommandProblem.zip

问题是这个,我有两个Buttons这样的.一个是绑定Command到一个RelayCommand实现,另一个绑定到Prism的实现DelegateCommand

<Button Command="{Binding DelegateSaveCommand}"/>
<Button Command="{Binding RelaySaveCommand}"/>
Run Code Online (Sandbox Code Playgroud)

ViewModel ICommands

DelegateSaveCommand = new DelegateCommand(Save, CanSaveDelegate);
RelaySaveCommand = new RelayCommand(param => Save(), param => CanSaveRelay);
Run Code Online (Sandbox Code Playgroud)

CanExecute方法/谓词

public bool CanSaveDelegate()
{
    return HasChanges;
}
public bool CanSaveRelay
{
    get { return HasChanges; }
}
Run Code Online (Sandbox Code Playgroud)

两人都在使用该物业HasChanges.何时HasChanges更新,仅CanSaveRelay更新.这是它的意思吗?

c# wpf command entity-framework prism

13
推荐指数
1
解决办法
2万
查看次数

WPF CommandParameter绑定和canExecute

我有一个treeView项的模板:

<HierarchicalDataTemplate x:Key="RatesTemplate">
    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=ID}"/>
                        <Button CommandParameter="{Binding Path=ID}" 
                                Command="{Binding ElementName=CalcEditView, Path=DataContext.Add}">Add</Button>                            
    </StackPanel>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)

作为DataContext,我有一个ID为非空字段的linq实体.

问题是:如果我使用CanExecutedMethod的DelegateCommand'Add':

AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute);
Run Code Online (Sandbox Code Playgroud)

它只调用一次,参数为null(而textBlock显示正确的ID值).在调用ID属性之前调用CanExecute(使用调试器检查).似乎在绑定到实际参数之前,wpf正在调用canExecute并忘记它.绑定完成并加载正确的值后,它不会再次调用CanExecute.

作为一种解决方法,我可以使用只有执行委托的命令:

Add = new DelegateCommand<int?>(AddExecute);
Run Code Online (Sandbox Code Playgroud)

使用正确的ID值调用AddExecute并且工作正常.但我仍然想使用CanExecute功能.有任何想法吗?

c# wpf delegatecommand

6
推荐指数
1
解决办法
9034
查看次数

CanExecute-Result确实更改后,控件不会刷新

在我的窗口中,我有加载和保存方法的按钮.我使用CommandBinding,并且save-button具有CanExecute属性,以防止用户在加载数据之前保存数据.

CanExecute-Methode连接到一个名为"canSaveXML"的简单bool值

private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    if (canSaveXML == false)
    {
        e.CanExecute = false;
    }
    else
    {
        e.CanExecute = true;
    }
    e.Handled = true;
} 
Run Code Online (Sandbox Code Playgroud)

我的意图是在加载数据后设置canSaveXML = true,但是在值发生更改后控件不会刷新.我做了一些阅读,发现我必须调用CommandManager.InvalidateRequerySuggested.我现在这样做,我的代码看起来像这样.

canSaveXML = true;
CommandManager.InvalidateRequerySuggested();
Run Code Online (Sandbox Code Playgroud)

但控件(按钮)仍然不刷新.我仍然被禁用,直到我在UI上触发任何内容或最小化/最大化窗口.我这样做后按钮启用.

这有什么不对?

在MSDN示例中,一次又一次地使用dispatchertimer调用CommandManager.InvalidateRequerySuggested,但我拒绝相信这将是唯一的解决方案.

c# wpf commandbinding

5
推荐指数
1
解决办法
4071
查看次数