Привязка к ReactiveUserControl.ViewModel не устанавливает ViewModel - PullRequest
0 голосов
/ 06 июня 2018

Я создал ReactiveUserControl<Item>.Он хорошо работает с ViewModelViewHost и так далее.

Я подумал, что мог бы использовать его самостоятельно в XAML следующим образом:

<local:ItemView ViewModel="{Binding SelectedBigItem.Item}"/>

, но это не работает - SelectedBigItem.Item не отображается.Свойство SelectedBigItem вызывает уведомления об изменениях.Элемент сам по себе является DTO - просто обычные свойства.

Я знаю два решения:

  1. Использование ViewModelViewHost - кажется огромным излишним, поскольку он всегда будет отображать один и тот же вид

  2. код подписки.Я дал элемент управления 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

...