2012-06-16 20 views
5

Tamam, komutları kullanmaktan kaçınırım çünkü her zaman benim dışımda kafa karıştırmayı başarabilirler, ama yeni bir projede çalışıyorum ve arka planda hiçbir kod olmadan doğru şekilde mimarlık yapmaya çalışıyorum görünüm. Temelde şu anda yapmaya çalıştığım her şey, benim görünüm modelimde bazı şeyleri yapan bir komutu tetikleyen bir düğmeyle bağdaştırıyor ve bir şekilde bu kadar basit bir şey hala bana sorun veriyor. Sanırım yakınım ama oraya tam olarak ulaşamıyorum. İşte şu an sahip olduğum şey.Viewmodel'den çağırma yöntemi

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

Ve görünümü modeli şu anda hemen hemen hiçbir şey olduğunu

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

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

Şimdi benim yapmaya çalışıyorum tel yukarıya sadece benim idam yöntemi çağırmak için benim komuta bağlamaları kurmak bu komut Benim görüş modelimde, ancak bu yöntemi kendi içinde bulmaya çalışır. Görünüm modelimdeki yöntemle onu yönetmenin bir yolu var mı, yoksa aynı şeyi başarmak için bunu ayarlamanın daha iyi bir yolu var mı? İlk başta basit tutmayı umarak bu yüzden fikrimi çok erken vermem.

+0

Kurulumu ihtiyaç bağlama ya xaml yoluyla veya – uowzd01

+0

'un arkasındaki kod Prism gibi standart MVVM çerçevelerinizde DelegateCommands'ı kullanmayı düşündünüz mü? Komutunuz VM'de yer aldığından komutları daha kolay hale getirdiğini ve CommandBindings'i tanımlamak zorunda kalmadan onu bağlayabileceğinizi düşünüyorum. –

cevap

11

ICommand'ı uygulayarak kendi komut sınıfımı kullanma eğilimindeyim. Ardından Button Command özelliğini, görünüm modelimde komut özelliğine bağlarım. Düğme tıklandığında, Command özelliğine bağlı olan her şeyi Execute yöntemini yürütür.

Bu çirkin iki dakikalık bir sürümdür, ancak bir Command sınıfını nasıl oluşturabileceğinizi gösterir ve daha sonra, görünüm modelinizde istediğiniz yöntemi geri gösteren delegeleri atayabilirsiniz.

ViewModel:

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); 
    } 
} 
Görünüm thusly kendisine bağlamak istiyorum

(DataContext görünümü modelinin bir örneği olarak ayarlanır varsayarak) :

<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

İyi görünüyor, bu durumda her komut için farklı bir işlev gönderebildiğiniz için MyCommand'ı her komut için temel olarak kullanıyor musunuz? –

+1

Bu durumda, evet. Öyleyse, yapmak istediğiniz tek şey görünüm modelinizde mevcut bir yöntemi çağırmaksa, pek çok farklı komut sınıfı oluşturmanız gerekmez. İsterseniz farklı komutlar oluşturabilirsiniz. – Japple