如何将WPF按钮绑定到ViewModelBase中的命令?

kor*_*or_ 47 c# wpf command mvvm viewmodel

我有一个AttributeView包含各种属性的视图.还有一个按钮,按下时,它应该为属性设置默认值.我还有一个ViewModelBase类,它是我所有ViewModel的基类.问题是我似乎无法使用WPF将命令绑定到命令.

我试过这个,但它没有做任何事情:

<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button>
Run Code Online (Sandbox Code Playgroud)

该命令是在(如下ViewModelBase)中定义的:

public CommandBase DataInitialization { get; protected set; }
Run Code Online (Sandbox Code Playgroud)

在应用程序启动时,为该命令创建一个新实例:

DataInitialization = new DataInitializationCommand()
Run Code Online (Sandbox Code Playgroud)

但是,WPF绑定似乎没有"找到"命令(按下按钮什么都不做).当前视图中使用的ViewModel派生自ViewModelBase.我还能尝试什么(我对WPF很新,所以这可能是一个非常简单的问题)?

yo *_*han 114

 <Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

窗口背后的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModelBase();
    }
}
Run Code Online (Sandbox Code Playgroud)

而ViewModel:

public class ViewModelBase
{
    private ICommand _clickCommand;
    public ICommand ClickCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), ()=> CanExecute));
        }
    }
     public bool CanExecute
     {
        get
        {
            // check if executing is allowed, i.e., validate, check if a process is running, etc. 
            return true/false;
        }
     }

    public void MyAction()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这会给你这个想法.

  • 是的,这是我在许多查找后找到的最佳解释.谢谢@Ethicallogics (7认同)
  • 看起来您忘记初始化_clickCommand,因此只要访问ClickCommand属性,您的示例将始终创建新的CommandHandler对象... (3认同)
  • 另外,要使用 _canExecute,您必须实现有关此的通知。WPF 有内置的默认机制来重新查询 CanExecute 属性。但要执行此操作,您的 ICommand 必须重新订阅默认命令管理器,如下所示: ` public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } 删除 { CommandManager.RequerySuggested -= 值;} } ` (2认同)