2015-10-27 45 views
1

對於ContextMenu中的菜單項狀態,我有一個問題。我有一個汽車ObversableCollection。汽車在列表框中可視化,每個列表框項目我想要一個ContextMenu。在該ContextMenu中有一個選項ReserveCar。ContextMenu CanExecute未更新

我遇到的問題是CarCanExecute只有當我右鍵點擊任何汽車時纔會執行一次。他們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> 

我的視圖模型:

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>