2017-07-03 1 views
0

"IsChecked"のバインディングの書き方は? 2つのメニューのどちらかをチェックしたいと思います。WPF ContextMenu IsCheckedバインディング

「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 ! 
     } 
    } 

がスコープ外にこれは...私はそれを使用することはできませんか?しかし、なぜ ?

答えて

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

それは働きます!ありがとうございました ! :) –

関連する問題