2015-02-13 4 views
0

Как использовать интерфейс ICommand с MVVM?Правильное использование MVVM и команд

В связи добавить DataContext (который является моим ViewModel : INotifyPropertyChanged) и я связываю свойство элемента управления - IsInterminate хода работы бара - в собственности моего ViewModel. Это свойство моего ViewModel не является статическим, поэтому мне нужен экземпляр ViewModel.

Мои вопросы: как я должен обновить этот экземпляр ViewModel (свойство, связанное с индикатором выполнения) в командном методе (этот метод имеет значение ViewModel)?

<StatusBar Grid.Row="1"> 
    <StatusBar.DataContext> 
     <viemodel:EventsViewModel x:Name="evm"/> 
    </StatusBar.DataContext> 
    <Label x:Name="lbStatusLabel" Width="70" Height="40" Content="{Binding EventsCollection.Count}"/> 
    <Separator /> 
    <ProgressBar x:Name="pbProgress" Width="300" Height="40" IsIndeterminate="{Binding Pennding}"/> 
</StatusBar> 

class EventsViewModel : ViewModel 
{ 
    private static FWatch fw; 
    private static string fileName; 
    private static string pathToFile; 
    private static string pathToDirectory; 

    public EventsViewModel() 
    { 
     _startCommand = new RelayCommand(OpenFileCommand); 
    } 

    private ICommand _startCommand; 
    public ICommand StartCommand 
    { 
     get { return _startCommand; } 
    } 

    private static ObservableCollection<Event> _eventsCollection = new ObservableCollection<Event>(); 
    public static ObservableCollection<Event> EventsCollection 
    { 
     get { return _eventsCollection; } 
    } 

    private static string _buttonContent = "Open file";   
    public string ButtonContent 
    { 
     get { return _buttonContent; } 
     set 
     { 
      _buttonContent = value; 
      NotifyPropertyChanged(); 
     } 
    } 

    private bool _pending = false; 
    public bool Pennding 
    { 
     get { return _pending; } 
     set 
     { 
      _pending = value; 
      NotifyPropertyChanged(); 
     } 
    } 

    private void OpenFileCommand() 
    { 
     // Here I want to update field _pennding - is it right? Or should I delegate it? 
     // Should I update `Pendding` property of `ViewModel` where is command's method or I should do it in behind-code of view? 
    } 
} 
+0

Да, это правильно, OpenFileCommand уже является делегатом, переданным в RelayCommand, именно так его следует использовать. Следует отметить, что при использовании RelayCommand (который, как мне кажется, из MVVMlight или оригинальной реализации Josh Smith) он должен быть установлен равным null, когда ViewModel удален, поэтому ViewModel должен реализовать IDisposable, если вы использовали DelegateCommand из MS Prism, t нужно реализовать IDisposable, использует ли он слабую ссылку для обработчиков событий внутри – AwkwardCoder

+0

@AwkwardCoder, но как изменить свойство Pennding в этом методе? –

+0

, как показано ниже @XAML Lover – AwkwardCoder

ответ

0

Вы должны использовать какой-либо компонент командной инфраструктуры. Есть несколько доступных. Например, MVVM Light является хорошим. Посмотрите здесь некоторые подсказки: How to use RelayCommand with the MVVM Light framework

Но вам нужна кнопка на форме, и привязать его к команде, чтобы вызвать действие на ViewModel.

Pending следует манипулировать в ViewModel. Связывание заботится обо всем остальном. Чтобы поднять «свойство изменилось» уведомление я использую:

this.OnPropertyChanged(() => Breedte); 

то свойство, которое изменяется, передается в том случае, если в конце концов поднимается. Я не вижу этого в вашем коде. Вы должны по крайней мере что-то подобное, как выше или

NotifyPropertyChanged("propertyName"); 

иначе структура не знает, что изменилось и как настроить графический интерфейс пользователя.

0

Вы должны установить "Ожидание" свойство из обработчика команд. В вашем случае это OpenFileCommand.

private void OpenFileCommand() 
{ 
    this.Pending = true; 
} 
+0

но он не работает. –

0

ОК теперь я знаю.

Использование datacontext в xaml создает экземпляры. Я использовал тег dataconytext 3 раза, чтобы у меня было 3 экземпляра моей viemodel.