2016-02-12 13 views
6

Czy ktoś wie, jak przekazać parametry do Command przy użyciu CommandHandler? Załóżmy, że chciałbym przekazać ciąg sztywno zakodowaną wartość z XAML. Wiem, jak przejść z XAML, ale nie jak sobie z tym poradzić w kodzie MVVM. Poniższy kod działa poprawnie, jeśli nie ma potrzeby przekazywania jakichkolwiek parametrów.Przesyłanie parametrów do polecenia MVVM

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

private void ExecuteAttachmentChecked() 
{   
} 

private bool CanExecuteAttachmentChecked() 
{ 
    return true; 
} 

CommandHandler:

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(); 
    } 
} 

Odpowiedz

7

Musisz zmienić dwie rzeczy

1.ZMIEŃ swój Commandhandler przyjąć parametr

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. Zmień metodę, aby zaakceptować CommandParameter:

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

parametr jest przekazywana w sposób ICommand.Execute, wystarczy przekazać ją poprzez do obsługi.

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

Należy po prostu napisać ciąg w CommandParameter:

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

a zmiana:

private Action _action; 
private bool _canExecute; 

aby umożliwić akceptować parametry:

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

Zakładając, że jesteś przy użyciu RelayCommand w parametrze obj metody DoSmth będzie "Hello":

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

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

To już odpowiedział, ale może nie wiedzieć, że istnieje kilka Ramki wokół uniknąć standardowy kod związany poleceniami (i INotifyPropertyChanged) w MVVM.

Jednym z najbardziej znanych jest MVVM Light, który obsłuży kilka rzeczy.

Używając tej ramy, to w jaki sposób można obsłużyć polecenia z parametrami:

(Uwaga: Zamierzamy utworzyć polecenie, które zmieniło UserControl wyświetlany, gdy UserControl jest „zasadnicza część” z aplikacja)

1) w swojej ViewModel należy zdefiniować RelayCommand z rodzaju argumentu (w tym przypadku, usercontrol)

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

2) określenie sposób być oprawiony z poleceniem (uproszczony tutaj)

public void navigate(UserControl nextPage) 
{ 
    currentUserControl = nextPage; 
} 

3) Zwiąż swoją komendę metody po prostu określonym

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

Twoje polecenie jest teraz wszystko ustawione i gotowe do wykorzystania w XAML, powiedzmy, że chcesz przejść na stronę z menu wyboru dla Przykład ...

4) Wiązanie polecenie z parametrem do kontroli (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> 

Uwaga: Pagemanager to po prostu klasa INI tializes wszystkie moje strony do ich domyślnych stanów, jest oczywiście odniesienie do niego w moim ViewModel.

Mam nadzieję, że to pomoże tobie lub każdemu przejechać

Powiązane problemy