UWP MVVM点击绑定到功能

本文关键字:功能 绑定 MVVM UWP | 更新日期: 2023-09-27 18:00:11

这可能是世界上最容易做的事情,但我有点挣扎。

我在XAML中有这个:

<Button Name="browseButton" Content="Browse" Grid.Column="1" />

从视图到视图模型,我已经正确地绑定了所有内容,比如单选按钮和输入文本框等……但我想要的是将这个按钮绑定到一个函数,这样当用户单击它时,就会发生一些操作。

但我真的很难弄清楚如何将单击此按钮绑定到视图模型中的函数。我在ICommand上玩了一点,没有走多远,我不想做那种把它粘在后面代码里的黑客行为。

如果有帮助的话,我会使用MVVMLight(Galasoft)。

感谢任何指导。

编辑

遵循中的示例https://msdn.microsoft.com/en-us/magazine/dn237302.aspx我有,但canExecuteMyCommand是从哪里来的?我如何在XAML中绑定它?

    public RelayCommand BrowseCommand
    {
        get;
        private set;
    }
    public LoadFilesViewModel()
    {
        BrowseCommand = new RelayCommand(executeBrowse, () => _canExecuteMyCommand);
    }
    private void executeBrowse()
    {
        // Do something 
    }

解决方案

<Button Name="browseButton" Content="Browse" Grid.Column="1" Command="{Binding BrowseCommand}" />

    public RelayCommand BrowseCommand
    {
        get;
        private set;
    }
    public LoadFilesViewModel()
    {
        BrowseCommand = new RelayCommand(executeBrowse, () => true);
    }
    private void executeBrowse()
    {
        // Do something 
    }

UWP MVVM点击绑定到功能

如果查看您提供的代码,RelayCommand构造函数带有2个参数。

public RelayCommand BrowseCommand
{
    get;
    private set;
}
public LoadFilesViewModel()
{
    BrowseCommand = new RelayCommand(executeBrowse, () => _canExecuteMyCommand);
}
private void executeBrowse()
{
    // Do something 
}

检查源代码(这就是学习代码库和开源使之成为可能)或Visual Studio IntelliSense,你会看到这个签名:

public RelayCommand(Action execute, Func<bool> canExecute)

因此,第一个参数是要执行的操作,第二个参数是检查它是否可以执行。您已经正确地将executeBrowse标识为"做某事"的方法。_canExecuteMyCommand参数是bool类型的类变量,它可以是true或false(在其他地方设置)。

在您自己的解决方案(有问题的发布)中,您将其替换为true(硬编码)。注意,在这种情况下,您也可以删除第二个参数:

public LoadFilesViewModel()
{
    BrowseCommand = new RelayCommand(executeBrowse); // will always execute
}

奖金

请注意,您也可以使用一个方法来定义该方法是否可以执行,而不是使用局部变量(或者使用委托语法内联编写检查逻辑)。

public LoadFilesViewModel()
{
    BrowseCommand = new RelayCommand(ExecuteBrowse, CanExecuteBrowse);
}
private void ExecuteBrowse()
{
    // Do something 
}
private bool CanExecuteBrowse()
{
    // Check if we are allowed to browser
    return true; // or false :)
}