Я создал ReactiveUserControl<Item>
.Он хорошо работает с ViewModelViewHost и так далее.
Я подумал, что мог бы использовать его самостоятельно в XAML следующим образом:
<local:ItemView ViewModel="{Binding SelectedBigItem.Item}"/>
, но это не работает - SelectedBigItem.Item не отображается.Свойство SelectedBigItem вызывает уведомления об изменениях.Элемент сам по себе является DTO - просто обычные свойства.
Я знаю два решения:
Использование ViewModelViewHost - кажется огромным излишним, поскольку он всегда будет отображать один и тот же вид
код подписки.Я дал элемент управления name = "ItemPreview" и в CB:
IDisposable sub = null;
sub = this.WhenActivated(d =>
{
ViewModel.WhenAnyValue(x => x.SelectedBigItem).Subscribe(quote =>
{
ItemPreview.ViewModel = quote?.Item;
}).DisposeWith(d);
sub.DisposeWith(d);
});
оба работают, и я ненавижу оба: один излишний, а второй чувствует себя обманщиком и утомительным.Почему привязка не работает?Я попытался установить различные триггеры и режимы, но ничего не помогло.
РЕДАКТИРОВАТЬ:
https://github.com/qrzychu/ReactiveUserControlBindingSample
Я создал быстрый образец.Существует 3 способа привязки, и единственный, который не работает, - через свойство ViewModel.SelectedItem.
<!-- Works-->
<local:ItemView DockPanel.Dock="Top" ViewModel="{Binding ElementName=List, Path=SelectedItem}"/>
<!-- Does not work-->
<local:ItemView DockPanel.Dock="Top" ViewModel="{Binding SelectedItem}"/>
<!-- Set in MainWindow.xaml.cs. Works-->
<local:ItemView DockPanel.Dock="Top" x:Name="ItemView"/>
В первом коммите вы можете видеть, что он ведет себя точно так же, когда нет BigItem и просто Item