Привязка RelayCommand И дополнительное условие - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь привязать CanExecute RelayCommand в моем главном окне к дочернему окну, которое, возможно, не существует.Как мне это сделать?

В настоящее время у меня есть:

<MenuItem Header="_Compact" 
       Command="{Binding Path=CurrentChildViewModel.CompactCommand}"
       IsEnabled="{Binding CurrentChildViewModel.CanExecuteCompactCommand, 
        Converter={StaticResource NullToBooleanConverter}}"/>

Однако это не похоже на работу, потому что конвертер должен работать на CurrentChildViewModel (а не на CanExecuteCompactCommand, но я также должен включитьчто CanExecuteCompactCommand каким-то образом.

Я хочу, чтобы пункт меню был включен, только если CurrentChildViewModel! = null и CurrentChildViewModel.CanExecuteCompactCommand () возвращает true.

(причина: CurrentChildViewModel является оконным ViewModelбыть открытым или нет, если он не открыт, я хочу, чтобы пункт меню был отключен.И если он открыт, я хочу, чтобы метод CanExecute команды Compact проверял, можно ли выполнить компактную команду, что-то вроде как минимум двухэлементы в списке в ChildView (Модель) выбраны.)

Кто-нибудь может помочь, пожалуйста?

1 Ответ

1 голос
/ 19 февраля 2012

, если вашему конвертеру нужен экземпляр CurrentChildViewModel, тогда свяжитесь с ним, а не с командой (удалите .CanExecuteCompactCommand) Тем не менее, с какой стати вы используете одну команду, чтобы определить, должна ли другая команда быть в состоянии выполнить? Вы должны использовать CanExecute вашей команды (CompactCommand).

<Ч />

Хорошо, я думаю, что теперь понимаю вашу настоящую проблему. Если я прав, то ваши xaml / bindings работают как положено, если только CurrentChildViewModel или CanExecuteCompactCommand не равны нулю. (при условии, что вы удалите конвертер.)

Чтобы решить эту проблему, вы можете добавить FallbackBalue=false к вашей привязке, это говорит привязке использовать false, когда она не может найти источник. А также добавьте TargetNullValue=false, что говорит привязке использовать false, когда источник равен нулю (CompactCommand в этом случае)

Так это будет выглядеть так:

IsEnabled="{Binding CurrentChildViewModel.CanExecuteCompactCommand,
                    FallbackValue=false,
                    TargetNullValue=false}"

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

, например

<Style TargetType="{x:Type MenuItem}" x:Key="menuItemWithCommand">
    <Style.Triggers>
        <Trigger Property="Command" value="{x:Null}">
            <Setter Property="IsEnabled" Value="False"/>
        </Trigger>
    </Style.Triggers>
</Style>
...
<MenuItem Header="_Compact"
          Style="{StaticResource menuItemWithCommand}"
          Command="{Binding Path=CurrentChildViewModel.CompactCommand}" />
...
CompactCommand= new RelayCommand(CompactCommandExecuted, CompactCommandCanExecute);
private void CompactCommandExecuted(obejct obj)
{   // Do your business
}
private bool CompactCommandCanExecute(object obj)
{
    // return true if the command is allowed to be executed; otherwise, false.
}
...