Ошибка выражения связывания при связывании с Nullable Int32 - PullRequest
1 голос
/ 13 июня 2019

Так что я думаю, что нашел действительно интересную ошибку в платформе UWP.

Если у меня есть textbox, и я связываю его свойство Text со свойством зависимости int?, тогда я получаю следующее исключение.Кажется, не имеет значения, привязывает ли мой потребитель обнуляемый int или не обнуляемый int к элементу управления, отображается та же ошибка.Похоже, это напрямую связано с тем, что свойство зависимости может быть обнуляемым.

Error: Converter failed to convert value of type 'Windows.Foundation.Int32' 
to type 'IReference`1<Int32>'; BindingExpression: Path='MyNotNullableInt' 
DataItem='ControlSandbox.FooViewModel'; target element is 
'ControlSandbox.NumericTextBox' (Name='null'); 
target property is 'Value' (type 'IReference`1<Int32>'). 

Я даже не использую конвертер, так что я предполагаю, что это происходит внутри системы.Приведенный ниже пример кода даст результат

Main.xaml

    <Grid Background="White" >
        <local:NumericTextBox Value="{Binding MyNotNullableInt, Mode=TwoWay}" />
    </Grid>

Main.xaml.cs

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            this.DataContext = new FooViewModel();
        }
    }

FooViewModel.cs

  public class FooViewModel : INotifyPropertyChanged
    {
        private int _myNotNullableInt;

        public int MyNotNullableInt
        {
            get { return _myNotNullableInt; }
            set { _myNotNullableInt = value; OnPropertyChanged("MyNotNullableInt"); }
        }

        private int? _myNullableInt;

        public int? MyNullableInt
        {
            get { return _myNullableInt; }
            set { _myNullableInt = value; OnPropertyChanged("MyNullableInt"); }
        }


        public FooViewModel()
        {
            MyNullableInt = null;
        }


        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string prop)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }
    }

NumericTextBox.xaml

    <Grid>
        <TextBox Text="{x:Bind Value}" />
    </Grid>

NumericTextBox.xaml.cs

 public sealed partial class NumericTextBox : UserControl
    {
        public int? Value
        {
            get { return (int?)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(int?), typeof(NumericTextBox), new PropertyMetadata(0));

        public NumericTextBox()
        {
            this.InitializeComponent();
        }
    }

1 Ответ

1 голос
/ 13 июня 2019

Так что я не уверен, почему эта страница не вернулась в первые часы нашего исследования ошибки, однако, по крайней мере, этот пост сейчас будет документировать это на будущее.

Я изучал привязку к обнуляемым свойствам зависимостей и наткнулся на эту статью

Оказывается, что под прикрытием большинство примитивных типов .NET преобразованы в эквивалентные типы среды выполнения Windows. Ieference происходит с быть эквивалентом Nullable для среды выполнения Windows в .NET.

В нем говорится, что вам нужно изменить тип свойства typeof для свойства зависимостей с вашего типа Nullable на object

Я подтвердил, что это работает.

public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(NumericTextBox), new PropertyMetadata(0));
...