Так что я думаю, что нашел действительно интересную ошибку в платформе 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();
}
}