Как запустить событие из ComboBox внутри StackPanel в WPF и MVVM

У меня есть ComboBox внутри StackPanel. Я использую MVVM и пытаюсь связать команду события «GotFocus» с командой в ViewModel, но когда я нажимаю «ComboBox», это не работает (он не вызывает команду в ViewModel), но если я перемещаю этот «ComboBox» «StackPanel» работает правильно.

How can I fire event from 'CombBox' inside 'StackPanel' in MVVM?

  <StackPanel x:Name="StackPanel" Grid.Column="2" Grid.Row="6">
    <ComboBox x:Name="ComboBox" ItemsSource="{Binding Values}">
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="GotFocus">
          <cmd:EventToCommand Command="{Binding Path=GotFocusCommand}"/>
        </i:EventTrigger>
      </i:Interaction.Triggers>
    </ComboBox>
  </StackPanel>

ViewModel's code is:

public ViewModelCommand GotFocusCommand { get; set; } 

person Yogesh    schedule 30.11.2011    source источник
comment
Что такое ViewModelCommand? Это какой-то из ваших пользовательских классов? Я бы сначала попытался связать обычный обработчик события GotFocus в поле со списком и посмотреть, вызывается ли он в любом случае. Например, если на вашей странице есть только одно поле со списком, оно может быть выбрано до того, как вы назначите DataContext, и тогда событие не будет запущено.   -  person Vladimir Perevalov    schedule 30.11.2011
comment
В моей модели представления есть команда, которую я связываю с выпадающим списком EventToCommand, то есть общедоступная ICommand GotFocusCommand { get { return _gotFocusCommand ?? (_gotFocusCommand = new RelayCommand(MethodNameToBeFired, () => _isLoaded)); } }   -  person Yogesh    schedule 01.12.2011


Ответы (1)


////Измените свой тег с EventToCommand на InvokeCommandAction

<StackPanel x:Name="StackPanel" Grid.Column="2" Grid.Row="6">
<ComboBox x:Name="ComboBox" ItemsSource="{Binding Values}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="GotFocus">
      <cmd:InvokeCommandAction="{Binding Path=GotFocusCommand}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</ComboBox>

////Then, I use my commands this way in my view model:

  private ICommand _GotFocusCommand;
    public ICommand GotFocusCommand
    {
        get
        {
            if (_GotFocusCommand == null)
            {
                _GotFocusCommand =
                    new RelayCommand(
                        param => GotFocusCommand_Executed(),
                        GotFocusCommand_CanExecute
                     );
            }

            return _GotFocusCommand;
        }
    }

////RelayCommandClass.cs:

public class RelayCommand : ICommand
{
private Action _handler;
public RelayCommand(Action handler)
{
    _handler = handler;
}

private bool _isEnabled;
public bool IsEnabled
{
    get { return _isEnabled; }
    set
    {
        if (value != _isEnabled)
        {
            _isEnabled = value;
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }
    }
}

public bool CanExecute(object parameter)
{
    return IsEnabled;
}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
    _handler();
}
}

////Наконец, вы можете создать событие в своей модели представления:

private void GotFocusCommand_Executed()
    {
        //DoSomething here
    }

private bool GotFocusCommand_CanExecute()
    {
        return true;
    }
person Community    schedule 01.12.2011
comment
Я использую GalaSoft.MvvmLight.Command, поэтому я могу получить доступ только к EventToCommand. Пожалуйста, позвольте мне «InvokeCommandAction» принадлежать к какому пространству имен. Спасибо - person Yogesh; 02.12.2011
comment
xmlns:i=schemas.microsoft.com/expression/2010/interactivity, полученный из Microsoft.Expression.Interactions.dll - person ; 06.12.2011