WPF CommandParameter 绑定未更新

Posted

技术标签:

【中文标题】WPF CommandParameter 绑定未更新【英文标题】:WPF CommandParameter binding not updating 【发布时间】:2011-03-06 18:15:37 【问题描述】:

我正在尝试在 WPF 应用程序中将 Command 和 CommandParameter 绑定与按钮一起使用。我有完全相同的代码在 Silverlight 中工作得很好,所以我想知道我做错了什么!

我有一个组合框和一个按钮,其中命令参数绑定到组合框SelectedItem:

<Window x:Class="WPFCommandBindingProblem.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Horizontal">
        <ComboBox x:Name="combo" VerticalAlignment="Top" />
        <Button Content="Do Something" Command="Binding Path=TestCommand"
                CommandParameter="Binding Path=SelectedItem, ElementName=combo"
                VerticalAlignment="Top"/>        
    </StackPanel>
</Window>

后面的代码如下:

public partial class MainWindow : Window

    public MainWindow()
    
        InitializeComponent();

        combo.ItemsSource = new List<string>()
            "One", "Two", "Three", "Four", "Five"
        ;

        this.DataContext = this;

    

    public TestCommand TestCommand
    
        get
        
            return new TestCommand();
        
    



public class TestCommand : ICommand

    public bool CanExecute(object parameter)
    
        return parameter is string && (string)parameter != "Two";
    

    public void Execute(object parameter)
    
        MessageBox.Show(parameter as string);
    

    public event EventHandler CanExecuteChanged;


在我的 Silverlight 应用程序中,当组合框的 SelectedItem 发生变化时,CommandParameter 绑定会导致我的命令的 CanExecute 方法使用当前选定的项目重新评估,并且按钮启用状态也会相应更新。

使用 WPF,由于某种原因,CanExecute 方法仅在解析 XAML 时创建绑定时调用。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要告诉 WPF CanExecute 可以更改 - 您可以在 TestCommand 类中自动执行此操作,如下所示:

public event EventHandler CanExecuteChanged

    addCommandManager.RequerySuggested += value;
    removeCommandManager.RequerySuggested -= value;

然后,每当视图中的属性发生变化时,WPF 都会询问 CanExecute。

【讨论】:

这将重新评估 UI 上所有更改的属性的所有命令?并且没有办法将它与委托命令一起使用?有没有像 silverlight 这样更简单或 ootb 的解决方案? 这只是最简单的方法——您可以控制何时调用 CanExecuteChanged 事件——在这里我只是将它设置为在框架决定它可能已更新时进行更新。

以上是关于WPF CommandParameter 绑定未更新的主要内容,如果未能解决你的问题,请参考以下文章

[WPF]解决模板中ContextMenu绑定CommandParameter的问题

WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

WPF CommandParameter 在第一次调用 CanExecute 时为 NULL

理解WPF Binding CommandParameter =“{Binding}”

wpf usercontrol,将按钮的命令参数绑定到父用户控件

wpf 事件参数 绑定到viewmdoel