En mi vista, tengo un botón.¿Cómo paso la información de View a ViewModel con DelegateCommand?
Cuando el usuario hace clic en este botón, quiero que ViewModel guarde el contexto de TextBlock en la base de datos.
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock Text="{Binding FirstName}"/>
<TextBox Text="Save this text to the database."/>
<Button Content="Save" Command="{Binding SaveCommand}"/>
</StackPanel>
Sin embargo, en mi DelegateCommand en mi modelo de vista, la opción "Guardar()" método no pasa ningún argumento, por lo que ¿cómo puedo obtener datos de la vista en ese momento?
#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
De hecho, resolví mi problema vinculando el TextBox a una propiedad de ViewModel (INotifyPropertyChanged), cuyo valor, por supuesto, el comando Save() tiene acceso, pero sus sugerencias son muy interesantes, las verificará. –
Existe un caso de uso específico (y razonablemente común) en el que la solución de Matt definitivamente gana al acceder a un valor límite separado: comandos ejecutados desde un 'ItemsControl'. Aquí, un botón, por ejemplo, en un 'ListView' puede usar su' DataContext' como parámetro y el elemento sobre el que se hizo clic en el botón se pasa junto con el comando. Es difícil determinar en cuál de los muchos elementos se hizo clic de otro modo. –
Tenga en cuenta que el «DelegateCommand» genérico 'tiene una restricción importante (que no se recoge hasta el tiempo de ejecución, el compilador no se queja): no puede usar un tipo de valor como parámetro. El consejo oficial es usar un tipo de valor que admite valores NULL (que está permitido) y verificar antes de su uso que contiene un valor (https://msdn.microsoft.com/en-us/library/gg431410%28v=pandp.50%29 .aspx - ver la sección "Observaciones"). –