Я просто попытался обновить один из моих проектов WPF от MVVM Light 4.2.30 до 5.2. После этого я заметил, что мои RelayCommands
больше не запускают их методы CanExecute
.Невозможно найти пространство имен GalaSoft.MvvmLight.CommandWpf в MVVM Light 5.2.0.37222
После быстрого поиска я нашел несколько статей, которые объясняют проблему и предлагают использовать пространство имен GalaSoft.MvvmLight.CommandWpf
вместо GalaSoft.MvvmLight.Command
. Однако я не могу найти пространство имен GalaSoft.MvvmLight.CommandWpf
. Когда я смотрю на GalaSoft.MvvMGalaSoft.MvvmLight.dll в «Обозревателе объектов» Visual Studio, я также не могу найти это пространство имен.
Как кажется, никто другой, но у меня есть эта проблема - любые идеи, что я делаю неправильно?
Update:
Я создал небольшой пример проекта, который показывает, как я в настоящее время используют RelayCommands с их методами CanExecute в версии 4.2.30 MVVM света:
public class ViewModel : ViewModelBase
{
private bool _isReadOnly = false;
public ViewModel()
{
this.DoSomethingCommand = new RelayCommand(DoSomething, CanDoSomething);
}
public bool IsReadOnly
{
get
{
return _isReadOnly;
}
set
{
_isReadOnly = value;
this.RaisePropertyChanged("IsReadOnly");
// With MVVMLight 4.2.30.23246 I did not need to call the RaiseCanExecuteChanged on any of my RelayCommands
// DoSomethingCommand.RaiseCanExecuteChanged();
}
}
public RelayCommand DoSomethingCommand { get; set; }
private bool CanDoSomething()
{
return !this.IsReadOnly;
}
private void DoSomething()
{
MessageBox.Show("Let's break the MVVM idea...");
}
}
The XAML код зрения:
<Window x:Class="MVVMLight5.2CanExecuteTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MVVMLight5._2CanExecuteTest"
mc:Ignorable="d"
Title="Test" Height="150" Width="200">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<CheckBox HorizontalAlignment="Center" Grid.Row="0" Grid.Column="0" Content="Is read only" IsChecked="{Binding IsReadOnly, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Row="1" Grid.Column="0" Content="Break me" Command="{Binding DoSomethingCommand}"/>
</Grid>
Моя цель заключается в том, что если у меня есть кнопка в представлении, которая использует команду «DoSomethingCommand» в качестве команды, тогда эта кнопка должна быть отключена, когда свойство IsReadOnly будет повернуто на false. При использовании MVVM light 4.2.30 это работает без каких-либо дополнительных до сих пор, но в свете MVVM 5.2 мне нужно добавить DoSomethingCommand.RaiseCanExecuteChanged(); чтобы кнопка была отключена.
Могу ли я каким-то образом получить старое поведение с новой средой MVVM?
Класс 'RelayCommand' находится в пространстве имен' CommandWpf ', только если вы ссылаетесь на PCL (переносную) версию библиотеки. При таргетинге на .NET 4.0 и ниже он находится в пространстве имен 'Command'. Вы уверены, что MvvmLight виноват? Можете ли вы опубликовать любой код? –
Нет Я не использую переносимую версию - я ссылаюсь на обычную версию версии 4.5. Почему это доступно только в версии PCL и только для .NET 4.0? Как я могу исправить свою проблему? – Ralf
На данный момент ответа не найдено. Тем временем мне интересно, как методы CanExecute предназначены для вызова в текущих версиях освещения MVVM: вручную? Может быть, в таймер? – Ralf