Как использовать интерфейс 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?
}
}
Да, это правильно, OpenFileCommand уже является делегатом, переданным в RelayCommand, именно так его следует использовать. Следует отметить, что при использовании RelayCommand (который, как мне кажется, из MVVMlight или оригинальной реализации Josh Smith) он должен быть установлен равным null, когда ViewModel удален, поэтому ViewModel должен реализовать IDisposable, если вы использовали DelegateCommand из MS Prism, t нужно реализовать IDisposable, использует ли он слабую ссылку для обработчиков событий внутри – AwkwardCoder
@AwkwardCoder, но как изменить свойство Pennding в этом методе? –
, как показано ниже @XAML Lover – AwkwardCoder