Как запустить событие из ComboBox внутри StackPanel в WPF и MVVM - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть ComboBox внутри StackPanel.Я использую MVVM и пытаюсь связать событие «GotFocus» Command с командой в ViewModel, но когда я нажимаю «ComboBox», это не работает (это не вызывает Command в 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; } 

1 Ответ

0 голосов
/ 01 декабря 2011

//// Измените ваш тег с 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>

//// Затем я использую свои команды таким образом в моей модели представления:

  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;
    }
...