Связывание uwp selectedIndex с enum не работает twoway - PullRequest
1 голос
/ 19 июня 2019

поэтому у меня есть ComboBox с некоторыми элементами и его SelectedIndex связан TwoWay со свойством типа MyTypeEnum идея состоит в том, что его Выбранное значение индекса может быть установлено преобразователем enum в int , и когда пользователь меняет выбор в самом выпадающем списке, тогда новый selectedIndex должен обновить значение, к которому он привязан. он работает нормально OneWay т.е.: из свойства в SelectedIndex, но не работает реверс , поэтому с точками останова я подтвердил, что метод Set моего связанного свойства не выполняется когда я изменяю выбор в выпадающем списке, метод ConvertBack моего конвертера выполняется, как и должно быть.

Я подготовил минимальное и простое репо кода, чтобы воспроизвести проблему: https://github.com/touseefbsb/ComboBoxToEnumBug

код

MainPage.xaml

<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Page.Resources>
    <local:IdToIndexConverter x:Key="IdToIndexConverter"/>
</Page.Resources>
<Grid x:DefaultBindMode="TwoWay">
    <ComboBox SelectedIndex="{x:Bind ViewModel.MyTypeEnum, Converter={StaticResource IdToIndexConverter}}" >
        <ComboBoxItem>item 1</ComboBoxItem>
        <ComboBoxItem>item 2</ComboBoxItem>
        <ComboBoxItem>item 3</ComboBoxItem>
    </ComboBox>
</Grid>

MainViewModel

public class MainViewModel : Observable
{
    private MyTypeEnum _myTypeEnum = MyTypeEnum.Type1;

    public MyTypeEnum MyTypeEnum
    {
        get => _myTypeEnum;
        set => Set(ref _myTypeEnum, value);
    }
}

Наблюдаемые

public class Observable : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
    {
        if (Equals(storage, value))
        {
            return;
        }

        storage = value;
        OnPropertyChanged(propertyName);
    }

    protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

MyTypeEnum

// используя байт в качестве родителя, чтобы я мог начать отсчет с 1 вместо 0

public enum MyTypeEnum : byte
{
    Type1 = 1,
    Type2,
    Type3
}

Преобразователь

public class IdToIndexConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language) => System.Convert.ToInt32(value) - 1;

    public object ConvertBack(object value, Type targetType, object parameter, string language) => ((int)value) + 1;
}

1 Ответ

0 голосов
/ 19 июня 2019

Я подтвердил, что метод Set моего связанного свойства не выполняется, когда я изменяю выбор в выпадающем списке, однако метод ConvertBack моего конвертера действительно выполняется, как и должно быть.

Ваш метод ConvertBack возвращает int, но он должен возвращать MyTypeEnum.

Свойство source модели представления не может быть установлено на int, только на MyTypeEnum.

Приведите int к перечислению в C #

...