在删除和添加相同项

时间:2015-08-11 06:23:38

标签: c# wpf mvvm contextmenu itemscontrol

我有一个非常严重的问题,我真的需要解决它。

在这个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

非常感谢你!

0 个答案:

没有答案