我有一个非常严重的问题,我真的需要解决它。
在这个TestProject中,有一个简单的视图:
<ItemsControl ItemsSource="{Binding Rectangles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Color}" Stroke="Black" MouseUp="Rectangle_MouseUp">
<Rectangle.Resources>
<local:BindingProxy x:Key="DataContext" Data="{Binding Path=.}"/>
</Rectangle.Resources>
<Rectangle.Style>
<Style TargetType="Rectangle">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu IsOpen="{Binding IsOpen}" DataContext="{Binding Path=Data, Source={StaticResource DataContext}}">
<MenuItem Header="Test"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</Rectangle.Style>
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
<Button Content="Remove and Add again the green one" Height="50" Click="ButtonAddRemove_Click" Grid.Row="1"/>
ItemsControl - 使用ContextMenu的元素。
我希望在将Property IsOpen设置为true时显示ContextMenu。
private void Rectangle_MouseUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (e.ChangedButton == MouseButton.Right)
{
var Rect = (sender as Rectangle).DataContext as MyRectangle;
Rect.IsOpen = true;
}
}
这是作品。
但删除并添加相同项目后:
private void ButtonAddRemove_Click(object sender, RoutedEventArgs e)
{
var Last = Rectangles.LastOrDefault();
Rectangles.Remove(Last);
Rectangles.Add(Last);
}
ContextMenu会立即出现并立即消失。
如果有人遗漏任何代码或想要尝试我的项目: TestProject.zip
非常感谢你!