2012-02-19 2 views
0

Я пытаюсь связать CanExecute RelayCommand в моем главном окне с дочерним окном, которое, возможно, не существует. Как я должен это делать?Связывание 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 окна tha t может быть открыт или нет, если он не открыт, я хочу, чтобы пункт меню был отключен. И если он открыт, я хочу, чтобы метод CanExecute команды Compact, чтобы проверить, может ли выполняться команда compact, что-то вроде как по крайней мере двух элементов в списке в ChildView (Model).)

Может кто угодно Помоги пожалуйста?

ответ

1

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


Хорошо, я думаю, что понимаю вашу актуальную проблему сейчас. Если я прав, то ваши xaml/привязки работают как ожидалось, если ни 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. 
} 
+0

Я хочу только одну команду, но эта команда находится внутри модели дочернего вида, и она не всегда открывается. Поэтому я могу назвать это только тогда, когда CurrentChildViewModel не является нулевым. –

+0

, так что я до сих пор не совсем понимаю ваш ответ ... –

+0

Это не имеет смысла для меня, вам нужно уточнить, что вы не понимаете. – Terkel

Смежные вопросы