2017-07-03 151 views
0

如何爲「IsChecked」編寫綁定? 我想檢查2菜單中的任何一個。WPF ContextMenu IsChecked綁定

如果我點擊「Hello1」,我想添加檢查「Hello1」, ,並刪除「Hello2」的檢查。

如果我點擊「Hello2」,我想添加檢查「Hello2」, 並刪除「Hello1」的檢查。

我試了一個星期。但是我不能。請幫我「如何寫綁定」 沒有互聯網的例子。 我最近開始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 ! 
     } 
    } 

這是超出範圍?但爲什麼 ?

回答

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)); 
    } 
} 
+0

它的工作原理!謝謝 ! :) –