Я знаю, что я делаю что-то не так с RaiseCanExecuteChanged и CanExecute

Ну а после того, как я поковырялся с MVVM light, чтобы моя кнопка включалась и отключалась, когда я этого хочу... Я как бы сжимал все вместе, пока это не сработало.

Тем не менее, я просто знаю, что я делаю что-то не так здесь. У меня есть RaiseCanExecuteChanged и CanExecute в той же области, которая вызывается. Конечно, это не так, как это делается?

Вот мой xaml

<Button Margin="10, 25, 10, 25" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50" Height="50" Grid.Column="1" Grid.Row="3" Content="Host">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <mvvmLight:EventToCommand Command="{Binding HostChat}" MustToggleIsEnabled="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

А вот и мой код

public override void InitializeViewAndViewModel()
{
    view = UnityContainer.Resolve<LoginPromptView>();
    viewModel = UnityContainer.Resolve<LoginPromptViewModel>();
    view.DataContext = viewModel;
    InjectViewIntoRegion(RegionNames.PopUpRegion, view, true);

    viewModel.HostChat = new DelegateCommand(ExecuteHostChat, CanHostChat);
    viewModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(ViewModelPropertyChanged);
}

void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Name" || e.PropertyName == "Port" || e.PropertyName == "Address")
    {
        (viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged();
        (viewModel.HostChat as DelegateCommand).CanExecute();
    }
}

public void ExecuteHostChat()
{
}

public bool CanHostChat()
{
    if (String.IsNullOrEmpty(viewModel.Address) ||
        String.IsNullOrEmpty(viewModel.Port) ||
        String.IsNullOrEmpty(viewModel.Name))
    {
        return false;
    }
    else
        return true;
}

Видишь, как эти двое вместе? Конечно, это не может быть правдой. Я имею в виду... это работает для меня... но что-то не так с этим. Разве RaiseCanExecuteChanged не должен вызывать CanExecute? Это не... и поэтому, если у меня нет этого CanExecute там, мой элемент управления никогда не переключает его IsEnabled, как мне это нужно.

(viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged();
(viewModel.HostChat as DelegateCommand).CanExecute();

РЕДАКТИРОВАТЬ:

Если я в итоге использую свойство Command кнопки для привязки моей команды к... все работает нормально. Я могу удалить CanExecute и просто оставить RaiseCanExecuteChanged, и все работает блестяще.

Как это... это работает просто отлично.

<Button Command="{Binding HostChat}" Margin="10, 25, 10, 25" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50" Height="50" Grid.Column="1" Grid.Row="3" Content="Host">
</Button>

void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Name" || e.PropertyName == "Port" || e.PropertyName == "Address")
    {
        (viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged();
        //(viewModel.HostChat as DelegateCommand).CanExecute();
        //CommandManager.InvalidateRequerySuggested();
    }
}

1 ответ

Решение

CanExecute Метод только возвращает, может ли команда быть выполнена или нет. Больше ничего не делает. Вам нужно только RaiseCanExecuteChanged, RaiseCanExecuteChanged позвоню CanHostChat в твоем случае.

Другие вопросы по тегам