2017-10-15 255 views
0

我想用枚舉類型綁定XAML中的某些屬性。 它應該如何工作:我在菜單欄中有一些單選按鈕,用於設置我的枚舉值。此枚舉值在Grid中設置isEnabled屬性。所以有一個關係:radiobutton - >(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的屬性給出元素枚舉值設置爲給定參數時。 在我看來,它應該工作得很好。我在這裏錯過了什麼?

回答

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。在轉換器中修復ConvertBack 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(電流激活指示),你並不需要一個單選按鈕控制,能見度結合相當路徑。

我會爲你展示在現有的方式解決:

一個。向每個MenuItem添加Click事件

b。放在Tag屬性相關的值(這是對事件的簡單,你會看到)

℃。添加到您的MainWindow類實現的接口,以便讓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

因此,如果在'MenuItem_Click'中修改了appMode屬性,我對'actionConverter'有什麼用處?我是否需要它? –

+0

不幸的是,經過此修改之後,所有'DockPanel'元素都被啓用,這意味着轉換器不會更改'isEnabled'屬性 –

+0

每次改變枚舉屬性時,PropertyChanged都爲null。 –