我有一个关于ContextMenu中菜单项状态的问题。我有一个汽车的ObversableCollection。汽车在一个ListBox中可视化,对于每个我想要的ListBox项目,都有一个ContextMenu。在ContextMenu中有一个选项ReserveCar。
我遇到的问题是,当我右键单击任何汽车时,Car的CanExecute只执行一次。在此之后,当我右键单击另一个CanExecute时,它们的Car将不再被调用。
这会导致当我右键单击一个可以保留的Car时,该MenuItem是活动的,但当我右键单击另一个我不应该保留的MenuItem时,该CanExecute仍然是活动的(因为不会再次调用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();发布于 2015-10-27 18:00:20
尝试在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>https://stackoverflow.com/questions/33363479
复制相似问题