在我的 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参数。