8
votes

I have the following XAML of a ComboBox which has a code-behind SelectionChanged event handler and another Command property of the ViewModel. I have set the SelectedIndex property to 0. Now when I run the project, the code-behind handler is invoked, but the Command is not executed. What I want is that the Command should be executed for SelectedIndex=0 the first time the View is loaded.

<ComboBox Name="listComboBox" SelectionChanged="listComboBox_SelectionChanged" SelectedIndex="0" SelectedValuePath="Content" Margin="5,0" Height="35" Width="150" VerticalAlignment="Center" HorizontalAlignment="Left">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding ListTypeComboSelectionChangedCmd}" CommandParameter="{Binding ElementName=listComboBox, Path=SelectedValue}"/>
        </i:EventTrigger>
     </i:Interaction.Triggers>
     <ComboBoxItem Content="ItemOne" />
     <ComboBoxItem Content="ItemTwo" />
     <ComboBoxItem Content="ItemThree" />
</ComboBox>

Update

Code-behind event handler:

private void listComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { }

ICommand object:

public ICommand ListTypeComboSelectionChangedCmd 
{ 
    get { return new RelayCommand<string>(ListTypeComboSelectionChangedCmdExec); }
    private set;
}

ICommand Handler:

private void ListTypeComboSelectionChangedCmdExec(string listType) { }
2
Why is this for? If you want something to happen just after the view as loaded why not do it when in loads? Also, no event will be fired for a SelectedIndex set in xaml at creation (not runtime).Xavier Huppé
You have an event and a command for the same thing. Get rid of the inline event call.Xcalibur37
@Sinity, if the selectionchanged event for the first ComboBoxItem is fired right after the view is loaded, then why shouldn't the command execute ?Lucifer
@Xcalibur37, even after I remove the SelectionChanged event handler the command does not execute.Lucifer
@Lucifer, if so, post the code which fire the event you're talking about (after the view as loaded).Xavier Huppé

2 Answers

7
votes

Bind SelectedValue to a Property on the view model.

In the Property set{...} block do your logic there or call

ListTypeComboSelectionChangedCmdExec(value)

See Binding ComboBox SelectedItem using MVVM

3
votes

In my case, I use handler in the code behind and connect it to ModelView as below.

var viewModel = (MyViewModel)DataContext;
if (viewModel.MyCommand.CanExecute(null))
    viewModel.MyCommand.Execute(null);

Please check this link: Call Command from Code Behind