2017-10-15 10 views
0

XAMLの一部の属性を列挙型でバインドしようとしています。 どのように動作するはずですか:メニューバーにラジオボタンがあり、その列挙値が設定されています。そして、この列挙値はにisEnabled属性を設定します。したがって、radiobutton - >(EnumToBooleanConverter) - > enumオブジェクト - >(EnumToIsActiveCnoverter) - >isEnabledというような関係があります。私はそのバインディングを実行するために2つのコンバータを書いています。 コード:WPFバインダで変換ができない

<Window.Resources> 
    <local:EnumToBooleanConverter x:Key="actionConverter" /> 
    <local:EnumToIsActiveConverter x:Key="activityConverter" /> 
</Window.Resources> 

...

<MenuItem Header="Settings"> 
      <MenuItem Header="Action"> 
       <MenuItem Header="Draw"> 
        <MenuItem.Icon> 
         <RadioButton GroupName="MenuActionButton" 
            IsChecked="{Binding Path=appMode, 
          Converter={StaticResource actionConverter}, 
          ConverterParameter={x:Static local:ApplicationMode.Draw}}"/> 
        </MenuItem.Icon> 
       </MenuItem> 
       <MenuItem Header="Edit"> 
        <MenuItem.Icon> 
         <RadioButton GroupName="MenuActionButton" 
            IsChecked="{Binding Path=appMode, 
          Converter={StaticResource actionConverter}, 
          ConverterParameter={x:Static local:ApplicationMode.Edit}}"/> 
        </MenuItem.Icon> 
       </MenuItem> 
       <MenuItem Header="Constraints"> 
        <MenuItem.Icon> 
         <RadioButton GroupName="MenuActionButton" 
            IsChecked="{Binding Path=appMode, 
          Converter={StaticResource actionConverter}, 
          ConverterParameter={x:Static local:ApplicationMode.Constraints}}"/> 
        </MenuItem.Icon> 
       </MenuItem> 
      </MenuItem> 
     </MenuItem> 

CSファイル:指定されたパラメータに列挙値はラジオボタンがチェックされている

public partial class MainWindow : Window 
{ 
    public ApplicationMode appMode { get; set; } 

    public MainWindow() 
    { 
     this.appMode = ApplicationMode.Draw; 
     InitializeComponent(); 
    } 
} 

public class EnumToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //return value.Equals(parameter); 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.Equals(true) ? parameter : Binding.DoNothing; 
    } 
} 
public class EnumToIsActiveConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.Equals(parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //return value.Equals(true) ? parameter : Binding.DoNothing; 
     return Binding.DoNothing; 
    } 
} 
public enum ApplicationMode 
{ 
    Draw, 
    Edit, 
    Constraints 
} 

EnumToBooleanConverter変更とEnumToIsActiveConverter変化isEnabledの属性が与えられましたenum値が指定されたパラメータに設定されている場合、 それはうまくいくはずです。私はここで何が欠けていますか?

答えて

1

もっと簡単な解決策、ラジオボタンなし:

。アイコンジョブのMenuItem Checkable機能を使用し、IsCheckedをappModeプロパティにバインドします。

<MenuItem Header="Action"> 
    <MenuItem Header="Draw" IsCheckable="True" 
      IsChecked="{Binding Path=appMode, 
           Converter={StaticResource actionConverter}, 
           ConverterParameter={x:Static local:ApplicationMode.Draw}}" /> 

    <MenuItem Header="Edit" IsCheckable="True" 
      IsChecked="{Binding Path=appMode, 
           Converter={StaticResource actionConverter}, 
           ConverterParameter={x:Static local:ApplicationMode.Edit}}" /> 
</MenuItem> 

b。コードで、PropertyChangeイベントをトリガーするプロパティを変更します。

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 

    private ApplicationMode _appMode; 

    public ApplicationMode appMode 
    { 
     get { return _appMode; } 
     set 
     { 
      _appMode = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(appMode))); 
     } 
    } 

    public MainWindow() 
    { 
     this.appMode = ApplicationMode.Draw; 
     InitializeComponent(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

} 

c。コンバーターのmetodeを修正してください:

public class EnumToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.Equals(parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return parameter; 
    } 
} 
+0

これはまさに私がこれをした方法です! –

+0

@ wis.niowyあなたは答えを受け入れる方法を知っていますか?ここを参照してくださいhttps://stackoverflow.com/help/someone-answers。あなたの質問履歴によれば、あなたはこれを行うことができるところでたくさんの質問をします。あなたは+2評判を得ています。 – dovid

1

RadioButtonコントロールを使用していますが、指標としてのみ使用しています。

このアイテムをクリックしても、MenuItemのみがラジオボタンではなくクリックを受信するため、プロパティ値は変更されません。

また、V(現在のアクティブな表示)では、RadioButtonコントロールは必要ありません。可視性バインディングを備えたかなりのパスです。

私は既存の方法で解決策を提示します:

a。各MenuItemにClickイベントを追加する

b。関連するValue in Tagプロパティを入力します(これはイベントの簡略化のためのものです)。

c。 MainWindowクラスの実装にINotifyPropertyChangedインターフェイスを追加して、XAMLがappModeのmodoficationを知っていることを確認します。ここ

コード、XAML:

<MenuItem Header="Draw" Click="MenuItem_Click" Tag="{x:Static local:ApplicationMode.Draw}" > 
    <MenuItem.Icon> 
     <RadioButton GroupName="MenuActionButton" 
       IsChecked="{Binding Path=appMode, 
    Converter={StaticResource actionConverter}, 
    ConverterParameter={x:Static local:ApplicationMode.Draw}}"/> 
    </MenuItem.Icon> 
</MenuItem> 
<MenuItem Header="Edit" Click="MenuItem_Click" Tag="{x:Static local:ApplicationMode.Edit}"> 
    <MenuItem.Icon> 
     <RadioButton GroupName="MenuActionButton" 
       IsChecked="{Binding Path=appMode, 
    Converter={StaticResource actionConverter}, 
    ConverterParameter={x:Static local:ApplicationMode.Edit}}"/> 
    </MenuItem.Icon> 
</MenuItem> 

MenuItem_Click Clickイベントの:

public event PropertyChangedEventHandler PropertyChanged; 

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    var item = (MenuItem)sender; 
    appMode = (ApplicationMode) item.Tag; 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(appMode))); 
} 
+0

appModeプロパティが 'MenuItem_Click'で変更された場合、私は' actionConverter'をどのように使用しますか?私はそれをまったく必要としますか? –

+0

残念ながら、この変更の後、すべての 'DockPanel'要素が有効になります。つまり、コンバータは' isEnabled'属性を変更しません。 –

+0

enumプロパティが変更されるたびに 'PropertyChanged'がnullです。 –

関連する問題