2016-05-05 3 views
2

Я новичок в C# и пытаюсь понять, как работают команды в архитектуре mvvm. Мне нужно сделать это, обновив некоторую информацию, когда я нажимаю кнопку. Я думаю, что я реализовал класс реле отлично, но обновления нет.Команда реле в Wpf

RelayCommand.cs

public class RelayCommand : ICommand 
{ 
    private Action<object> execute; 
    private Func<object, bool> canExecute; 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute) 
    { 
     this.execute = execute; 
     this.canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return this.canExecute == null || this.canExecute(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     this.execute(parameter); 
    } 
} 

MovieViewModel.cs

class MovieViewModel : INotifyPropertyChanged 
{ 
    Movie _movie; 

    private ICommand _updateCommand; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public MovieViewModel() 
    { 
     _movie = new Movie 
     { 
      Title = "Unknown", 
      Genre = "Unknown", 
      Price = 11.0, 
      Score = 0 
     }; 
    } 

    public Movie Movie 
    { 
     get 
     { 
      return _movie; 
     } 
     set 
     { 
      _movie = value; 
     } 
    } 

    public string Title 
    { 
     get 
     { 
      return Movie.Title; 
     } 
     set 
     { 
      Movie.Title = value; 
      RaisePropertyChanged("Title"); 
     } 
    } 

    public string Genre 
    { 
     get 
     { 
      return Movie.Genre; 
     } 
     set 
     { 
      Movie.Genre = value; 
      RaisePropertyChanged("Genre"); 
     } 
    } 

    public double Price 
    { 
     get 
     { 
      return Movie.Price; 
     } 
     set 
     { 
      Movie.Price = value; 
      RaisePropertyChanged("Price"); 
     } 
    } 

    public double Score 
    { 
     get 
     { 
      return Movie.Score; 
     } 
     set 
     { 
      Movie.Score = value; 
      RaisePropertyChanged("Score"); 
     } 
    } 

    private void RaisePropertyChanged(string name) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public ICommand UpdateCommand 
    { 
     get 
     { 
      if (_updateCommand == null) 
      { 
       _updateCommand = new RelayCommand(p => { updateMovie("ASD", "ZXC", 11.90, 0); }, p => true); 
      } 
      return _updateCommand; 
     } 
     set 
     { 
      _updateCommand = value; 
     } 
    } 

    public Movie updateMovie(string title, string genre, double price, double score) 
    { 
     _movie.Title = title; 
     _movie.Genre = genre; 
     _movie.Price = price; 
     _movie.Score = score; 

     return _movie; 
    } 
} 

связывания команды Кнопка

<Button x:Name="updateBtn" Content="Update" Grid.Column="1" Grid.Row="5" Width="75" Height="30" Command="{Binding UpdateCommand}"/> 
+0

уточните, что не обновляет actully – Eldho

+0

Единственные переменные там; название, жанр, цена и оценка – Miral

+0

Ничего из этого не обновляются в интерактивном режиме? Проверьте наличие ошибок привязки. Почему '_movie.Title' вы можете установить свой' public Movie' вместо частной переменной, – Eldho

ответ

2

Постарайтесь дать

RaisePropertyChanged("Movie"); 

С благодарностью @Maverik дал также указание причины. Вы не поднимаете событие PropertyChanged, так как вы обходите свойство и напрямую обращаетесь к базовым полям. Вы должны использовать виртуальную машину, как она предназначена.

Доступ к виртуальной машине в модель применим к вам так же сильно, как и к представлениям и другим связанным клиентам на вашей виртуальной машине.

+0

В чат-комнате WPF я сказал ему просто получить доступ к данным через «Свойства» вместо полей, так как это правильный способ делать что-то, но это тоже работает :) Тем не менее вы можете предложить такое же (как при доступе через свойства) – Maverik

+0

@Maverik PLS добавить, что как ответ, так что в будущем некоторые получат пользу – Eldho

+0

Нет, это не стоит, как конкурирующий ответ. Если вы еще не упомянули, что основная проблема PropertyChanged не вызвана, возможно, я сделал это. Но вышеприведенного комментария должно быть достаточно для будущих посетителей. – Maverik

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