2012-06-16 43 views
5

OK, tiendo a evitar el uso de comandos porque siempre logran confundirme, pero estoy en un proyecto nuevo y estoy tratando de diseñarlo correctamente sin código en mi ver. Básicamente, todo lo que estoy tratando de hacer ahora es conectar un botón que dispara un comando que hace algunas cosas en mi modelo de vista, y de alguna manera algo tan simple todavía me está dando problemas. Creo que estoy cerca, pero no puedo llegar allí. Esto es lo que tengo ahora.Comando para llamar al método desde viewmodel

<Window.Resources> 
    <RoutedUICommand x:Key="GetMusic" /> 
</Window.Resources> 
<Window.DataContext> 
    <core:ViewMain /> 
</Window.DataContext> 
<Window.CommandBindings> 
    <CommandBinding Command="{StaticResource GetMusic}" Executed="GetMusicExecuted"/> 
</Window.CommandBindings> 

Y el modelo de vista es casi nada en este momento

public class ViewMain 
{ 
    public MusicCollection Music { get; set; } 

    private void GetMusicExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     //Logic 
    } 
} 

Ahora lo que estoy tratando de hacer es de cable hasta este comando I fijó en mis fijaciones de mando a solo di mi método ejecutado en mi modelo de vista, sin embargo, trata de encontrar ese método dentro de la vista. ¿Hay alguna manera de dirigirlo al método en mi modelo de vista, o una forma mejor de configurar esto para lograr lo mismo? Esperando mantenerlo simple al principio, así que no me vuelvo loco demasiado temprano.

+0

necesita configurar la unión, ya sea a través de XAML o código detrás de – uowzd01

+0

¿Ha considerado usar DelegateCommands en sus marcos de MVVM estándar como Prism? Creo que hace que comandar sea mucho más fácil ya que su comando reside en la máquina virtual y puede enlazarlo sin tener que definir Combinaciones de comandos. –

Respuesta

11

Tiendo a usar mi propia clase de comando, implementando ICommand. A continuación, vinculo la propiedad Command del botón a la propiedad del comando en mi modelo de vista. Cuando se hace clic en el botón, ejecuta el método Execute lo que esté vinculado a la propiedad Command.

Esta es la fea versión de dos minutos, pero muestra cómo se puede hacer una clase de comando y luego asignarle delegados que señalen al método que prefiera en su modelo de vista.

El modelo de vista:

public class MyViewModel 
{ 
    public MyCommand ActionCommand 
    { 
     get; 
     set; 
    } 

    public MyViewModel() 
    { 
     ActionCommand = new MyCommand(); 
     ActionCommand.CanExecuteFunc = obj => true; 
     ActionCommand.ExecuteFunc = MyActionFunc; 
    } 

    public void MyActionFunc(object parameter) 
    { 
     // Do stuff here 
    } 

} 

public class MyCommand : ICommand 
{ 
    public Predicate<object> CanExecuteFunc 
    { 
     get; 
     set; 
    } 

    public Action<object> ExecuteFunc 
    { 
     get; 
     set; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return CanExecuteFunc(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     ExecuteFunc(parameter); 
    } 
} 

La vista se uniría a ella thusly (suponiendo DataContext se establece en una instancia del modelo de vista):

<Window x:Class="exp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Command="{Binding Path=ActionCommand}">Action</Button> 
    </Grid> 
</Window> 
+0

Se ve bien, en este caso, ¿está utilizando MyCommand como base para cada comando ya que puede enviar una función diferente para ejecutar para cada uno? –

+1

En este caso, sí. Entonces no tiene que crear muchas clases de comando diferentes si todo lo que quiere hacer es llamar a un método existente en su modelo de vista. Podrías crear diferentes comandos si quisieras. – Japple

Cuestiones relacionadas