簡體   English   中英

WPF與轉換器綁定不起作用

[英]WPF Binding with converter does not work

我試圖用枚舉類型綁定XAML中的某些屬性。 它應該如何工作:我在菜單欄中有一些單選按鈕,用於設置枚舉值。 並且此枚舉值在Grid設置isEnabled屬性。 因此存在一個關系:單選按鈕->(EnumToBooleanConverter)->枚舉對象->(EnumToIsActiveCnoverter)-> isEnabled屬性。 我已經編寫了兩個轉換器來執行該綁定。 碼:

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

選中EnumToIsActiveConverter按鈕時, EnumToBooleanConverter會將枚舉值更改為給定參數;當將枚舉值設置為給定參數時, EnumToIsActiveConverter更改給定元素的isEnabled屬性。 在我看來,它應該工作正常。 我在這里想念什么?

您正在使用RadioButton控件,但僅作為指示器。

因此,單擊該項不會更改屬性值,因為只有MenuItem會收到Click,而不是RadioButton。

這也有點浪費,因為對於V(當前活動指示),您不需要RadioButton控件,而需要具有可見性綁定的Path。

我將以現有方式為您提供解決方案:

一種。 將Click事件添加到每個MenuItem

b。 將相關的Value放入Tag屬性(這將簡化事件,如您所見)

C。 INotifyPropertyChanged接口的實現添加到您的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 for 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)));
}

沒有RadioButton的更簡單的解決方案:

一種。 將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方法:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM