使用ReactiveUI绑定到组合框中的选定项目

时间:2018-12-28 22:16:34

标签: c# xaml mvvm reactiveui

我正在尝试从组合框中获取所选项目,并将其值发送到我的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>

这是我的代码,用于使用reactUI进行绑定

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 :(得分:1)

您需要将Grado.ItemSource绑定到用于存放数据的收藏集,否则将无法选择任何项目。

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

答案 1 :(得分:0)

理想情况下,您应该从标签模型转向MVVM

SelectedItem始终为null,因为您没有使用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);