如何从WPF和MVVM中的StackPanel内的ComboBox触发事件

时间:2011-11-30 13:07:23

标签: wpf mvvm-light

我在StackPanel中有ComboBox。我正在使用MVVM并尝试在ViewModel中将'GotFocus'事件命令绑定到Command,但是当我单击'ComboBox'时,它不起作用(它不会在ViewModel中调用Command)但是如果我将'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 :(得分:0)

////将您的标记从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;
    }