#uwp #reactiveui
#uwp #reactiveui
Вопрос:
Я пытаюсь создать свое первое приложение ReactiveUI в UWP и столкнулся с некоторыми неожиданными предупреждениями / ошибками, с которыми я не знаю, что делать.
Я использую ReactiveUI версии 12.1.1 в приложении UWP (минимальная версия 10/1809/17763, максимальная версия 10/2004/19041).
Я следовал (насколько я думаю, что я все сделал правильно) инструкциям здесь: https://www.reactiveui.net/docs/handbook/data-binding/microsoft-store
Вот определение страницы:
<Page
x:Class="UwpReactiveUiTest.Views.GridsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:UwpReactiveUiTest.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">
<Grid>
<Slider
x:Name="slider"
Maximum="50"
Minimum="0"
Value="25" />
</Grid>
</Page>
Вот код для страницы:
public sealed partial class GridsView : Page, IViewFor<GridsViewModel>
{
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register(
nameof(ViewModel),
typeof(GridsViewModel),
typeof(GridsView),
new PropertyMetadata(null)
);
public GridsViewModel ViewModel
{
get => (GridsViewModel)GetValue(ViewModelProperty);
set => SetValue(ViewModelProperty, value);
}
object IViewFor.ViewModel
{
get => ViewModel;
set => ViewModel = (GridsViewModel)value;
}
public GridsView()
{
this.InitializeComponent();
ViewModel = new GridsViewModel();
}
}
Вот модель представления:
public class GridsViewModel : ReactiveObject
{
private double _sliderValue;
public double SliderValue
{
get => _sliderValue;
set => this.RaiseAndSetIfChanged(ref _sliderValue, value);
}
public GridsViewModel()
{
}
}
Когда я запускаю приложение, все в порядке; Я получаю много сообщений о загрузке DLL на выходе, как и ожидалось, но это все.
Однако, как только я добавляю привязку в конструктор представления, например:
public GridsView()
{
this.InitializeComponent();
ViewModel = new GridsViewModel();
this.WhenActivated(disposableRegistration =>
{
this.Bind(ViewModel,
viewModel => viewModel.SliderValue,
view => view.slider.Value)
.DisposeWith(disposableRegistration);
});
}
Я получаю это на выходе:
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.dll
LogHost: Initializing to normal mode
POCOObservableForProperty: The class UwpReactiveUiTest.Views.GridsView property slider is a POCO type and won't send change notifications, WhenAny will only return a single value!
Мои вопросы:
- Исключения.Откуда берутся исключения и что я могу / должен с этим делать?
- Предупреждение POCO.Почему я получаю предупреждение POCO и что я могу / должен с этим делать?
Ответ №1:
- Исключения, если они возникают только при запуске, были решены ReactiveUI 2395
- Предупреждение POCO, это предупреждение, дающее вам знать, что ваше свойство не будет уведомлять об изменениях. Их можно игнорировать. Но, если вам интересно, почему ваше свойство не обновляется, эти предупреждения обычно будут индикатором того, почему. Я не знаю, можете ли вы отключить это, но это не то, о чем нужно беспокоиться.
Комментарии:
1. Спасибо, что прояснили это для меня. Я беспокоился, что сделал что-то глупое, но, судя по тому, что вы сказали, это не так. По крайней мере, я могу быть достаточно уверен, что они не влияют на другие проблемы, которые я получаю (исключение NullReferenceException при привязке к свойству ObservableAsPropertyHelper). Мне нужно взглянуть на них по-другому. Ваша помощь очень ценится. Еще раз спасибо.