在我的 View 中,我有一个按钮。

当用户单击此按钮时,我希望ViewModel将TextBlock的上下文保存在数据库中。

<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
    <TextBlock Text="{Binding FirstName}"/>
    <TextBox Text="Save this text to the database."/>
    <Button Content="Save" Command="{Binding SaveCommand}"/>
</StackPanel>

但是,在ViewModel的DelegateCommand中,“Save()”方法没有传递任何参数,那么那时候如何从 View 中获取数据?
#region DelegateCommand: Save
private DelegateCommand saveCommand;

public ICommand SaveCommand
{
    get
    {
        if (saveCommand == null)
        {
            saveCommand = new DelegateCommand(Save, CanSave);
        }
        return saveCommand;
    }
}

private void Save()
{
    TextBox textBox = ......how do I get the value of the view's textbox from here?....
}

private bool CanSave()
{
    return true;
}
#endregion

最佳答案

checkout this MSDN article by Josh Smith。在其中,他显示了DelegateCommand的变体,他将其称为RelayCommand,并且RelayCommand上的Execute和CanExecute委托(delegate)接受类型为object的单个参数。

使用RelayCommand,可以通过CommandParameter将信息传递给委托(delegate):

<Button Command="{Binding SaveCommand}"
        CommandParameter="{Binding SelectedItem,Element=listBox1}" />

更新

查看this article,似乎有一个DelegateCommand的通用版本,该版本以类似的方式接受参数。您可能想要尝试将SaveCommand更改为DelegateCommand<MyObject>并更改Save和CanSave方法,以便它们采用MyObject参数。

10-08 08:39