2016-02-12 17 views
6

kullanarak Command parametrelerini geçirmeyi bilen var mı? Diyelim ki, XAML'den dize kodlanmış bir değer geçirmek istiyorum. XAML'den nasıl geçeceğimi biliyorum, ancak arkasındaki MVVM kodunda nasıl ele alınacağını bilmiyorum. Herhangi bir parametreyi geçmeye gerek olmaması durumunda aşağıdaki kod iyi çalışır.Parametreleri MVVM Komutu'na geçirme

public ICommand AttachmentChecked 
{ 
    get 
    { 
     return _attachmentChecked ?? (_attachmentChecked = new CommandHandler(() => ExecuteAttachmentChecked(), CanExecuteAttachmentChecked())); 
    } 
} 

private void ExecuteAttachmentChecked() 
{   
} 

private bool CanExecuteAttachmentChecked() 
{ 
    return true; 
} 

CommandHandler: parametre ICommand.Execute yönteminde geçirilen

public class CommandHandler : ICommand 
{ 
    private Action _action; 
    private bool _canExecute; 

    public CommandHandler(Action action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

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

    public event EventHandler CanExecuteChanged; 

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

cevap

7

Sen

1.Değiştir senin Commandhandler parametre kabul etmek iki şey

değiştirmeniz gerekir

public class CommandHandler : ICommand 
{ 
    private Action<object> _action; 
    private bool _canExecute; 
    public CommandHandler(Action<object> action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

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

    public event EventHandler CanExecuteChanged; 

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

2. CommandParameter kabul etmek için yöntemi değiştirin:

public ICommand AttachmentChecked 
{ 
    get 
    { 
     return _attachmentChecked ?? (_attachmentChecked = new CommandHandler(param => ExecuteAttachmentChecked(param), CanExecuteAttachmentChecked())); 
    } 
} 

private void ExecuteAttachmentChecked(object param) 
{ 
//param will the value of `CommandParameter` sent from Binding 
} 

private bool CanExecuteAttachmentChecked() 
{ 
    return true; 
} 
5

, sadece işleyicisi onu geçmesine gerek.

<Button Command="{Binding NextCommand}" 
CommandParameter="Hello" 
Content="Next" /> 

ve değişim dan:

public class CommandHandler : ICommand 
{ 
    private Action<object> _action; 
    private bool _canExecute; 
    public CommandHandler(Action<object> action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

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

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     _action(parameter); 
    } 
} 
7

Sadece CommandParameter içine dize yazmalısınız

readonly Action<object> _execute;   
readonly Predicate<object> _canExecute; 

sen varsayarsak:

private Action _action; 
private bool _canExecute; 

parametrelerini kabul izin vermekkullanarak yöntemin DoSmth parametresi obj yılında"Merhaba" olacaktır:

public RelayCommand YourCommand { get; set; } 
public YourViewModel() 
{ 
    NextCommand = new RelayCommand(DoSmth); 
} 

private void DoSmth(object obj) 
{ 
    Message.Box(obj.ToString()); 
} 
3

Bu zaten yanıtlandı ama bazı Çerçeveler etrafında komutları (ve INotifyPropertyChanged) MVVM ilgili Demirbaş kodu önlemek için olduğunu bilmiyor olabilir.

En ünlülerden biri sizin için birkaç şeyi ele alacak olan MVVM Light.Bu çerçeveyi kullanarak

, bu parametrelerle bir komutu nasıl idare geçerli:

(Not: UserControlDaha "ana parçası" olduğu gibi biz görüntülenen UserControl değişti komut oluşturmak için gidiyoruz senin ViewModel olarak uygulama)

1), bu durumda (argüman türü ile bir RelayCommand tanımlamak, bir UserControl)

public RelayCommand<UserControl> changePageCommand { get; private set; } 

2) yöntemini tanımlar)

burada basitleştirilmiş komuta (binded edilecek
public void navigate(UserControl nextPage) 
{ 
    currentUserControl = nextPage; 
} 

3) Sadece hakimiyetin artık tüm kurmak ve en menü seçimleri için sayfayı geçiş yapmak istediğiniz diyelim senin XAML kullanıma hazır

changePageCommand = new RelayCommand<UserControl>((page) => navigate(page)); 

tanımlanan yönteme emrinizi bağlayın örnek ... Kontroller parametresi komutu Bağlanma

4) (XAML)

<Menu> 
    <MenuItem Header="_Pages"> 
     <MenuItem Header="_Account" 
        Command="{Binding changePageCommand}" 
        CommandParameter="{Binding pageManager.accountPage}" /> 
     <MenuItem Header="_Profile" 
        Command="{Binding changePageCommand}" 
        CommandParameter="{Binding pageManager.profilePage}" /> 
    </MenuItem> 
</Menu> 

Not: pagemanager sadece ini bir sınıftır tüm sayfalarımı varsayılan durumlarına göre inceler, ViewModel'imde açıkça bir referans vardır.

Bu, sizin veya herhangi birinin

tarafından iletilmesine yardımcı olur.