【问题标题】:WPF ContextMenu IsChecked BindingWPF ContextMenu IsChecked 绑定
【发布时间】:2017-07-03 06:31:06
【问题描述】:

如何为“IsChecked”编写绑定? 我想检查 2 个菜单中的任何一个。

如果我点击“Hello1”,我想在“Hello1”上添加检查, 并删除“Hello2”的检查。

如果我点击“Hello2”,我想在“Hello2”上添加检查, 并删除“Hello1”的检查。

我尝试了 1 周。但是我不能。请帮我“如何编写绑定” 没有互联网的例子。 我最近开始 WPF 编程。我只能做表格申请。 这是非常不同的......

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <ContextMenu Name="ContextMenuMain" x:Key="menuListBox">
            <MenuItem Header="Hello1" IsChecked="{Binding Path=IsCheck1, Mode=OneWay}"  Name="ContextMenu_Hello1" Click="ContextMenuClick_Hello1"/>
        <MenuItem Header="Hello2"   IsChecked="{Binding Path=IsCheck2, Mode=OneWay}" Name="ContextMenu_Hello2" Click="ContextMenuClick_Hello2"/>
    </ContextMenu>
    </Window.Resources>

</Window>

我最困难的一点是下面的代码。 我尝试在 MainWindow 中使用“ContextMenu_Hello1”的名称。 但是 C# 不允许我使用它...

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ContextMenu_Hello1.DataContext  // error !
        }
    }

这超出范围了吗?但是为什么?

【问题讨论】:

    标签: wpf binding contextmenu


    【解决方案1】:

    设置窗口的ContextMenu 属性。如果您希望能够检查菜单项,您还应该将IsCheckable 属性设置为true。另外,您不能将绑定模式设置为OneWay

    <Window x:Class="WpfApp2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp2"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
    
        <Window.ContextMenu>
            <ContextMenu Name="ContextMenuMain">
                <MenuItem Header="Hello1" IsCheckable="True" IsChecked="{Binding Path=IsCheck1}"  Name="ContextMenu_Hello1" />
                <MenuItem Header="Hello2" IsCheckable="True" IsChecked="{Binding Path=IsCheck2}" Name="ContextMenu_Hello2" />
            </ContextMenu>
        </Window.ContextMenu>
    </Window>
    

    完成这些更改后,您可以绑定到DataContext 的任何属性:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow ()
        {
            InitializeComponent();
            DataContext = this;
        }
    
        private bool _isCheck1;
        public bool IsCheck1
        {
            get { return _isCheck1; }
            set
            {
                _isCheck1 = value;
                NotifyPropertyChanged();
                _isCheck2 = !_isCheck1;
                NotifyPropertyChanged("IsCheck2");
            }
        }
    
        private bool _isCheck2;
        public bool IsCheck2
        {
            get { return _isCheck2; }
            set
            {
                _isCheck2 = value;
                NotifyPropertyChanged();
                _isCheck1 = !_isCheck2;
                NotifyPropertyChanged("IsCheck1");
            }
        }
    
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 2011-06-25
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多