首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContextMenu as静态资源问题

ContextMenu as静态资源问题
EN

Stack Overflow用户
提问于 2016-02-03 17:51:25
回答 1查看 547关注 0票数 0

我已经为我遇到的一个问题抓挠了一段时间,最终发现它是contextmenu作为一个静态资源的问题。

我遇到的问题是,当我将上下文菜单移动到静态资源中,并使用数据触发器根据对象的状态加载上下文菜单时,按钮命令似乎在第一次加载时绑定的数据上下文上卡住了,但另一个绑定工作得很好。

下面是一个视图,其中包含一个使用自定义项模板的列表视图,该项模板是:

代码语言:javascript
复制
 <DataTemplate x:Key="appListTemplate">
    <Button cal:Message.Attach="Run" HorizontalAlignment="Stretch" VerticalAlignment="Center">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="#BBF7F7F7"/>
                <Setter Property="Cursor" Value="Hand"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Grid Height="50" HorizontalAlignment="Stretch" Background="{TemplateBinding Background}">

                                <Border CornerRadius="5" Height="35" Width="35" Background="SkyBlue" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"/>

                                <Label Content="{Binding AppName}" ToolTip="{Binding AppStatus}" VerticalAlignment="Center" Margin="50,0,0,0" FontSize="16"/>

                                <Image Source="{Binding Icon}" ToolTip="{Binding AppIconName}" Stretch="UniformToFill" Height="20" Width="20" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,15,0"/>

                                <StackPanel VerticalAlignment="Top">
                                    <Line Stroke="#FFCDCDCD" Stretch="Fill" X2="1" />
                                    <Line Stroke="#FFEAEAEA" Stretch="Fill" X2="1" />
                                </StackPanel>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding AppStatus}" Value="{x:Static enum:AppStatus.DISABLED}">
                        <Setter Property="IsEnabled" Value="False"/>
                        <Setter Property="Background" Value="Lime"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding AppStatus}" Value="{x:Static enum:AppStatus.NOACCESS}">
                        <Setter Property="Opacity" Value="0.5"/>
                        <Setter Property="ContextMenu" Value="{StaticResource ResourceKey=NoAccessContextMenu}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding AppStatus}" Value="{x:Static enum:AppStatus.INSTALLED}">
                        <Setter Property="ContextMenu" Value="{StaticResource ResourceKey=InstalledContextMenu}"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding AppStatus}" Value="{x:Static enum:AppStatus.NOTINSTALLED}">
                        <Setter Property="ContextMenu" Value="{StaticResource ResourceKey=UninstalledContextMenu}"/>
                    </DataTrigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="#FFF7F7F7"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</DataTemplate>

正如你所看到的,根据状态的不同,会加载不同的上下文菜单。这些定义如下:

代码语言:javascript
复制
 <ContextMenu x:Key="InstalledContextMenu" StaysOpen="False">
    <MenuItem Header="{Binding AppName}" HorizontalContentAlignment="Right" FontWeight="Bold" IsEnabled="False"/>
    <Separator/>
    <MenuItem x:Name="RunApplication" Header="Run" cal:Message.Attach="Run"/>
    <MenuItem Header="Uninstall" cal:Message.Attach="Uninstall"/>
</ContextMenu>
<ContextMenu x:Key="UninstalledContextMenu" StaysOpen="False">
    <MenuItem Header="{Binding AppName}" HorizontalContentAlignment="Right" FontWeight="Bold" IsEnabled="False"/>
    <Separator/>
    <MenuItem x:Name="Install" Header="Install" cal:Message.Attach="Install"/>
</ContextMenu>
<ContextMenu x:Key="NoAccessContextMenu" StaysOpen="False">
    <MenuItem Header="{Binding AppName}" HorizontalContentAlignment="Right" FontWeight="Bold" IsEnabled="False"/>
    <Separator/>
    <MenuItem x:Name="RequestAccess" Header="Request Access" cal:Message.Attach="RequestAccess"/>
</ContextMenu>

当您右键单击列表中的第一项时,问题就出现了,它会正确地显示选项,例如

代码语言:javascript
复制
SHIPPING
--------
Run
Uninstall

这项工作是100%的,然而,当你右键单击列表中的第二项时,你会得到以下结果:

代码语言:javascript
复制
PROJECTS
--------
Run
Uninstall

正如您所看到的,appname绑定更新得很好,但是当您单击uninstall时,它会调用发货VM上的uninstall方法,而它应该调用项目VM上的uninstall方法。这将继续发生,因为每个项目都会调用Shipping VM上的方法。

我完全不知道我能做些什么,甚至不知道为什么会发生这样的事情。任何帮助都是非常受欢迎的。

EN

回答 1

Stack Overflow用户

发布于 2016-02-03 19:07:32

好的,感谢人们的一些提示,我最终找到了这一点。导致该问题的原因是,上下文菜单不在可视化树中,而microsofts的“修复”是使上下文菜单继承其父数据上下文,但是这种情况只发生一次,而且很明显,当更改数据上下文时,例如更改列表视图中的选定项时,数据上下文永远不会更新。

为了解决这个问题,我将contextmenu更改为以下内容。

代码语言:javascript
复制
<ContextMenu x:Key="InstalledContextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" StaysOpen="False">
    <MenuItem Header="{Binding AppName}" HorizontalContentAlignment="Right" FontWeight="Bold" IsEnabled="False"/>
    <Separator/>
    <MenuItem x:Name="RunApplication" Header="Run" cal:Action.TargetWithoutContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}" cal:Message.Attach="Run"/>
    <MenuItem Header="Uninstall" cal:Action.TargetWithoutContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}" cal:Message.Attach="Uninstall"/>
</ContextMenu>
<ContextMenu x:Key="UninstalledContextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" StaysOpen="False">
    <MenuItem Header="{Binding AppName}" HorizontalContentAlignment="Right" FontWeight="Bold" IsEnabled="False"/>
    <Separator/>
    <MenuItem x:Name="Install" cal:Action.TargetWithoutContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}"  Header="Install" cal:Message.Attach="Run"/>
</ContextMenu>
<ContextMenu x:Key="NoAccessContextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" StaysOpen="False">
    <MenuItem Header="{Binding AppName}" HorizontalContentAlignment="Right" FontWeight="Bold" IsEnabled="False"/>
    <Separator/>
    <MenuItem x:Name="RequestAccess" cal:Action.TargetWithoutContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}" Header="Request Access" cal:Message.Attach="RequestAccess"/>
</ContextMenu>

如您所见,我现在为datacontext创建了自己的绑定,然后为每个菜单项上的caliburn微操作设置目标上下文。必须为每个菜单项执行此操作有点麻烦,但这似乎是最简单的解决方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35173574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档