2012-02-26 9 views
0

У меня есть команда, которая должна переключать текущий вид, когда он выполняется. Я переплетен эта команда, чтобы мои кнопки, как это:Как передать CommandParameters в ViewModel?

<Button Style="{StaticResource TextButton}" Command="{Binding ViewModel:MainViewModel.OpenItemCommand}" CommandParameter="{Binding Link}"/> 

Я хочу передать ссылку (ссылку на выбранную статью) к моей команде. Моя команда определяется следующим образом:

В моей ViewModel я это:

public ICommand OpenItemCommand 
{ 
    get 
    { 
     if (_openItemCommand == null) 
     { 
      _openItemCommand = new Command.Command(
       p => true, 
       p => OpenItem(_HOW_DO_I_GET_THE_PARAMETER?_) 
      ); 
     } 
     return _openItemCommand; 
    } 
    set 
    { 
     if (_openItemCommand != value) 
     { 
      _openItemCommand = value; 
      RaisePropertyChanged("OpenItemCommand"); 
     } 
    } 
} 

private void OpenItem(Uri link) 
{ 
    throw new NotImplementedException(); 
} 

Когда я создаю команду, мне нужно передать параметр командной строки (по ссылке) методу Execute. Но как я могу это оценить? Я определил CommandParameter в XAML, но я не знаю, как получить к нему доступ.

Я действительно искал через огромное количество веб-сайтов, но я не могу найти ответ.

ответ

1

Вы должны смотреть на реализацию DelegateCommand Prism или RelayCommand MVVM света. С их помощью можно было бы написать такой код:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     OpenItemCommand = new RelayCommand<string>(OpenItem); 
    } 

    public RelayCommand<string> OpenItemCommand { get; private set; } 

    private void OpenItem(string link) 
    { 
     Debug.WriteLine(link); 
    } 
} 

где string в данном случае тип параметра.

Я не уверен, где находится параметр ссылки, но если это элемент управления, значение элемента управления может быть привязано к свойству вашей модели представления, тогда вам не нужен параметр, например :

public class ViewModel 
{ 
    public ViewModel() 
    { 
     OpenItemCommand = new RelayCommand(OpenItem); 
    } 

    public RelayCommand OpenItemCommand { get; private set; } 

    public string Link { get; set; } 

    private void OpenItem() 
    { 
     Debug.WriteLine(Link); 
    } 
} 
+0

Спасибо, выглядит очень хорошо :) У меня только проблема, что XAML не может найти мою команду. Я создал публичный RelayCommand в моей модели ViewModel, и я пытаюсь вызвать его с помощью

+0

Установите DataContext вашего представления в вашу модель просмотра, например. public MyView() {InitializeComponent(); DataContext = новый ViewModel(); }. Или сделайте это в xaml. – Phil

1

заменить

p => OpenItem(_HOW_DO_I_GET_THE_PARAMETER?_) 

с

p => OpenItem(p) 

, что это то, что p обозначает: параметр

+0

Oooh, как глупо от меня. Благодаря! Получил это сейчас, я думаю :) –

Смежные вопросы