Привязка к выбранному элементу в выпадающем списке с помощью ReactiveUI - PullRequest
0 голосов
/ 29 декабря 2018

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

Вотмое поле со списком в представлении

<ComboBox Name="Grade">
   <ComboBoxItem Tag="White">
       <Image Source="/Assets/Belts/White.png"/>
   </ComboBoxItem>
   <ComboBoxItem Tag="White_1">
        <Image Source="/Assets/Belts/White_1.png"/>
   </ComboBoxItem>
</ComboBox>

А вот мой код для выполнения привязки с использованием реактивного интерфейса пользователя

this.Bind(this.ViewModel, 
          x => x.SelectedGrade, 
          x => (ComboBoxItem) x.Grado.SelectedItem)
          .DisposeWith(disposable);

Это прекрасно работает, но только в одном направлении.

Вопрос в том, как мне извлечь тег из выпадающего списка?

Я пробовал что-то вроде

this.Bind(this.ViewModel, 
          x => x.SelectedGrade, 
          x => x.Grado.SelectedItem.Tag)
          .DisposeWith(disposable);

, а также использовал .ToString (), а также экспериментировал с selectedValue, но, похоже, ничего не работает.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

В идеале вам следует отойти от модели тегов и перейти к MVVM.

SelectedItem всегда будет нулевым, поскольку вы не используете ItemSource.Использование ComboBoxItem - плохая практика.Вы можете абстрагировать свою оценку в класс, а затем привязать к ItemSource.Тогда ваше свойство SelectedItem не будет иметь значение

public class Grade 
{
   public string ImageName { get; set; }
   public BitmapSource ImageSource => BitmapImage(new Uri($"pack://application:,,,/AssemblyName;component/{ImageName}")); 
}

По вашему мнению, теперь сделайте

this.Bind(this, vm => vm.SelectedItem, view => view.combo.SelectedItem);
this.OneWayBindBind(this, vm => vm.Grades, view => view.combo.ItemsSource);
0 голосов
/ 29 декабря 2018

Вам необходимо привязать Grado.ItemSource к коллекции, в которой хранятся ваши данные, иначе у вас не будет элементов для выбора.

this.OneWayBind(ViewModel, vm => vm.Grades, view => view.Grado.ItemSource)

...