2017-10-15 11 views
0

XAML의 일부 특성을 열거 형으로 바인딩하려고합니다. 작동 방식 : 메뉴 모음에 열거 형 값을 설정하는 라디오 버튼이 있습니다. 이 열거 형 값은 isEnabled 속성을 Grid에 설정합니다. 따라서 라디오 버튼 -> (EnumToBooleanConverter) -> 열거 형 개체 -> (EnumToIsActiveCnoverter) ->isEnabled 특성이 있습니다. 바인딩을 수행하기 위해 두 개의 변환기를 작성했습니다. 코드 :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 (A)의 속성은 주어진 enum 값이 주어진 매개 변수로 설정된 경우 요소. 그것은 나에게 잘 작동해야합니다. 내가 여기서 무엇을 놓치고 있니?

답변

1

더 간단한 해결책 경우 RadioButton없이 :

가. 아이콘 작업에 대해 MenuItem Checkable 기능을 사용하고 IsChecked를 appMode 속성에 바인딩하십시오.

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. 컨버터에서 ConvertBack 코드를 수정하십시오 :

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에만 RadioButton이 아닌 Click이 수신되기 때문에 항목을 클릭해도 속성 값이 변경되지 않습니다.

V (현재 활성 표시)에는 RadioButton 컨트롤이 필요하지 않으므로 가시성 바인딩이있는 꽤 많은 경로가 필요합니다.

나는 기존의 방식으로 솔루션을 제공합니다 :

을 수행합니다. 각 MenuItem에 Click 이벤트를 추가하십시오.

b. 관련 Value of Tag 속성을 입력하십시오 (이는 알 수 있듯이 이벤트 단순성을위한 것임)

c. MainWindow 클래스에 구현하여 INotifyPropertyChanged 인터페이스를 구현하면 XAML이 appMode 수정을 알 수 있습니다. 여기

코드, 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입니다. –