WPF ContextMenu IsChecked 绑定
WPF ContextMenu IsChecked Binding
如何为"IsChecked"编写绑定?
我想检查 2 个菜单中的任何一个。
如果我点击 "Hello1",我想在 "Hello1" 上添加检查,
并删除 "Hello2".
的检查
如果我点击 "Hello2",我想在 "Hello2" 上添加检查,
并删除 "Hello1".
的检查
我试了 1 周。但是我不能。请帮助我 "How to write binding"
没有互联网的例子。
我最近开始 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 !
}
}
这超出范围了吗?但是为什么?
设置window的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));
}
}
如何为"IsChecked"编写绑定? 我想检查 2 个菜单中的任何一个。
如果我点击 "Hello1",我想在 "Hello1" 上添加检查, 并删除 "Hello2".
的检查如果我点击 "Hello2",我想在 "Hello2" 上添加检查, 并删除 "Hello1".
的检查我试了 1 周。但是我不能。请帮助我 "How to write binding" 没有互联网的例子。 我最近开始 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 !
}
}
这超出范围了吗?但是为什么?
设置window的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));
}
}