RvdK
RvdK

Reputation: 19790

ContextMenu CanExecute is not updated

I have a problem regarding the state of a menuitem in ContextMenu. I have a ObversableCollection of Cars. The cars are visualized in a ListBox, for each ListBox Item I want a ContextMenu. In that ContextMenu there is an option ReserveCar.

They problem I'm having is that the CanExecute of the Car is only executed once when I right click any car. They CanExecute will not be called anymore after that when I right click an other Car.

This causes that when I rightclick a Car which can be Reserved, the MenuItem is active, but when I then rightclick another which I should not be able to reserve the MenuItem remains active (because CanExecute is not called again).

<ListBox
    ItemsSource="{Binding Cars}"
    SelectedItem="{Binding SelectedCar}">
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Reserve Car" 
                        CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}"
                        Command="{Binding ReserveCarCommand}">
                <MenuItem.Icon>
                    <Image Source="{StaticResource ReserveCarIcon}" Width="24" Height="24"/>
                </MenuItem.Icon>
            </MenuItem>
        </ContextMenu>
    </ListBox.ContextMenu>
</ListBox>

My ViewModel:

private RelayCommand<Car> _reserveCarCommand;
public ICommand ReserveCarCommand
{
    get { return _reserveCarCommand ?? (_reserveCarCommand = new RelayCommanReserveCar, CanReserveCar)); }
}

public bool CanReserveCar(Car car)
{
    return !car.IsReserved && ReservationsAreOpen;
}

public void ReserveCar(Car car)
{
    car.IsReserved = true;
}

Also when I manually refresh the Command when doing something, the CanExecute is called with a null as parameter, so thats not working either.

if (_reserveCarCommand != null) _reserveCarCommand .RaiseCanExecuteChanged();

Upvotes: 1

Views: 730

Answers (1)

user1672994
user1672994

Reputation: 10839

Try binding the context menu on ListBoxItem instead of ListBox. As binding of context menu for ListBox happen only at the fist right click so CanExectute will not fire after first right click.

<ListBox Name="simpleListBox"
         ItemsSource="{Binding Cars}"
        SelectedItem="{Binding SelectedCar}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        ...
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Upvotes: 1

Related Questions