WPF ResourceDictionary上下文菜单 - 来自其他类的菜单项可见性属性更新

时间:2017-05-30 06:00:05

标签: c# wpf xaml data-binding

我的WPF项目中有一个ResourceDictionary。整个项目旨在在后台运行。在ResourceDictionary中有一个上下文菜单,代码在这里;

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Commands="clr-namespace:_365Drive.Office365.NotificationManager"
                    xmlns:tb="http://www.hardcodet.net/taskbar"
                    xmlns:local="clr-namespace:_365Drive.Office365.NotificationManager">

    <LinearGradientBrush x:Key="MenuBackground" EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="White" Offset="1" />
        <GradientStop Color="White" Offset="0.259" />
    </LinearGradientBrush>
    <ContextMenu x:Shared="false" x:Key="SysTrayMenu" Name="contextMenu">
        <MenuItem Header="Sign in" Command="{Binding ShowAuthForm}" CommandParameter="{Binding}" />
        <MenuItem Header="Prompt MFA now" Name="MFA"  Command="{Binding ClearMFACacheCommand}" CommandParameter="{Binding}" Visibility="{Binding MFAVisibility}" />
        <MenuItem Header="Sign out" Command="{Binding SignOutApplicationCommand}" CommandParameter="{Binding}" />
        <Separator />
        <MenuItem Header="Update Drive Mappings" Command="{Binding RefreshSettingsCommand}" CommandParameter="{Binding}" />
        <Separator />
        <MenuItem Header="Exit" Command="{Binding ExitApplicationCommand}" />
    </ContextMenu>

</ResourceDictionary>

它背后的代码如下(仅代码片段)

public class NotifyIconViewModel
{
    private Visibility visibility = Visibility.Collapsed;
    public Visibility MFAVisibility
    {
        get
        {
            return ((1) == null ? Visibility.Collapsed : Visibility.Visible);
        }
        set
        {
            visibility = value;
        }
    }
}

代码中还有其他代码,但这与此问题无关。

我想从同一个项目中的其他类更新上面的属性值,但我不知道如何获取与contextMenu绑定的该类的实例。

如果我尝试使用如下代码设置MenuItem可见性,它就不起作用;

public static void DisableMFAMenuitem()
{
    System.Windows.Controls.ContextMenu ctxMenu = (System.Windows.Controls.ContextMenu)System.Windows.Application.Current.FindResource("SysTrayMenu");
    System.Windows.Controls.ItemCollection items = ctxMenu.Items;
    System.Windows.Controls.MenuItem itemtobeRemoved = null;

    foreach (var item in items)
    {
        if (item.GetType() == typeof(System.Windows.Controls.MenuItem))
        {
            // do your work with the item 
            if (((System.Windows.Controls.MenuItem)item).Name == "MFA")
            {
                ((System.Windows.Controls.MenuItem)item).Visibility = Visibility.Collapsed; // OR WHATEVER really
            }
        }
    }
}

我认为我在理解方面犯了一些小错误,请问有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

来自Grx70的评论有帮助。

  

我不确定我是否理解你在这里想要实现的目标,而是来自   第一眼看到我的猜测是麻烦制造者是   X:共享=&#34;假&#34;属性设置在您的资源上,这意味着每个   FindResource(&#34; SysTrayMenu&#34;)调用将产生一个新的ContextMenu实例   (因此您不会修改任何预先存在的实例)。