将上下文菜单的可见性设置为隐藏/折叠时,出现空白的上下文菜单

时间:2019-09-06 12:03:00

标签: wpf contextmenu datatrigger

我不显示上下文菜单,也不显示单个菜单或两个菜单。我正在使用MVVM模式。

我尝试将上下文菜单可见性链接到bool属性,这似乎起作用,但是在当前控件后面呈现了一个空的上下文菜单,一旦关闭当前控件,该菜单便变得可见。我尝试添加绑定到相同属性的数据触发器-但这不会被触发。检查视觉树表明,上下文菜单已设置为默认属性。

MenuItem可见性工作正常,因此我可以显示1或2个项目。但是,当不需要上下文菜单时,enter image description here

后面会出现一个空白菜单。

注意:隐藏或折叠可见性的结果相同

上下文菜单作为静态资源绑定到DataGrid:

  RowStyle="{StaticResource PagedGridRowStyle}"
       <ContextMenu x:Key="BlankMenu" Visibility="Hidden">
        </ContextMenu>
        <ContextMenu x:Key="PagedGridMenu"
                     Visibility="{Binding Path=DataContext.ContextMenuEnabled, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource VisConverter}}"
                     DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
            <MenuItem Header="{Binding Path=DataContext.MenuActionName1, RelativeSource={RelativeSource AncestorType=UserControl}}"
                      Visibility="{Binding Path=DataContext.ContextMenuEnabled, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource VisConverter}}"
                      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext}"
                      Command="{Binding Path=DataContext.MenuActionCommand1, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
            <MenuItem Header="{Binding Path=DataContext.MenuActionName2, RelativeSource={RelativeSource AncestorType=UserControl}}"
                      Visibility="{Binding Path=DataContext.ContextMenu2Enabled, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource VisConverter}}"
                      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext}"
                      Command="{Binding Path=DataContext.MenuActionCommand2, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
        </ContextMenu>
        <Style x:Key="PagedGridRowStyle"
               TargetType="{x:Type DataGridRow}">
            <Setter Property="ContextMenu"
                    Value="{StaticResource PagedGridMenu}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ContextMenuEnabled}" Value="false">
                    <Setter Property="ContextMenu" Value="{StaticResource BlankMenu}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

请注意,VisConverter只是切换可见性,可见性和可见性。折叠在布尔值上

Style.Triggers-以上: 这是尝试替换完整的上下文菜单的尝试-避免空白的上下文菜单在控件后面打开。 -但不会被解雇。

       private bool _contextMenu2Enabled;
        public bool ContextMenu2Enabled
        {
            get => _contextMenu2Enabled;
            set
            {
                _contextMenu2Enabled = value;
                OnPropertyChanged();
            }
        }

        private bool _contextMenuEnabled;
        public bool ContextMenuEnabled
        {
            get => _contextMenuEnabled;
            set
            {
                _contextMenuEnabled = value;
                OnPropertyChanged();
            }
        }

绑定错误:

当ContextMenuEnabled = false时:(和ContextMenu2Enabled = false)

System.Windows.Data Error: 40 : BindingExpression path error: 'ContextMenuEnabled' property not found on 'object' ''DataRowView' (HashCode=33440573)'. BindingExpression:Path=ContextMenuEnabled; DataItem='DataRowView' (HashCode=33440573); target element is 'DataGridRow' (Name=''); target property is 'NoTarget' (type 'Object')

没有显示“上下文”菜单,但是在数据网格后面显示了一个空的上下文菜单,并且在关闭数据网格后可以看到该菜单

当ContextMenuEnabled = true(并且ContextMenu2Enabled = false)时 相同的BindingExpression错误-但上下文菜单按预期显示单个项目。

当ContextMenuEnabled = true和ContextMenu2Enabled = true时 相同的BindingExpression错误--但是两个Context菜单项均按预期显示。

1 个答案:

答案 0 :(得分:1)

您可以在设置器中将private static string CreateBaseString(string oauth_nonce, string oauth_timestamp, string status) { string baseFormat = "in_reply_to_status_id=1169662308278292480&oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" + "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}"; string baseString = String.Format(baseFormat, oauth.OAuth_Consumer_Key, oauth_nonce, oauth.OAuth_Signature_Method, oauth_timestamp, oauth.OAuth_Token, oauth.OAuth_Version, EncodingUtils.UrlEncode(status)); return String.Concat("POST&", EncodingUtils.UrlEncode(oauth.Resource_Url), "&", EncodingUtils.UrlEncode(baseString)); } 属性设置为ContextMenu而不是显示空白的ContextMenu

null

如果在视图模型中定义了<Setter Property="ContextMenu" Value="{x:Null}"/> 属性,则应使用ContextMenuEnabled绑定到它:

RelativeSource
相关问题