2015-10-27 5 views
1

У меня проблема с состоянием элемента menu в ContextMenu. У меня есть ObversableCollection of Cars. Автомобили визуализируются в ListBox, для каждого элемента ListBox я хочу ContextMenu. В этом ContextMenu есть опция ReserveCar.ContextMenu CanExecute не обновляется

У меня проблема в том, что CanExecuteCar выполнен только один раз, когда я нажимаю правой кнопкой мыши любой автомобиль. Они CanExecute больше не будут вызываться после этого, когда я нажимаю правой кнопкой мыши другой Car.

Это приводит к тому, что когда я щелкните правой кнопкой мыши на Car, который может быть зарезервирован, то MenuItem активен, но когда я затем щелкните правой кнопкой мыши другой, который я не должен быть в состоянии резервируем MenuItem остается активным (потому что CanExecute не вызывается снова).

<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> 

Мой 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; 
} 

Кроме того, когда я вручную обновить команду, делая что-то, CanExecute вызывается с null в качестве параметра, так что это еще не работает, либо.

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

ответ

1

Попробуйте обязательную ListBoxItem вместо ListBox контекстного меню. Поскольку привязка контекстного меню для ListBox происходит только при первом щелчке правой кнопкой мыши, то CanExectute не запускается после первого щелчка правой кнопкой мыши.

<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>