c# - ComboBox 中的选定属性未显示

标签 c# wpf xaml mvvm

我有一个 ViewModel,它有一个集合和一个表示集合中所选值的属性。在我看来,这显示在 ComboBox 中。 “填充”我的 ViewModel 时,所选项目未显示在我的 View 中。

我的 View 模型

public class DriverViewModel : MasterDataWithAddressViewModel<Driver>
{
    public ObservableCollection<Vehicle> Vehicles
    {
        get { return _vehicles; }
        set
        {
            if (_vehicles != value)
            {
                _vehicles = value;
                RaisePropertyChanged("Vehicles");
            }
        }
    }
    public Vehicle SelectedVehicle
    {
        get { return PrimaryModel.Vehicle; }
        set
        {
            if (PrimaryModel.Vehicle != value)
            {
                PrimaryModel.Vehicle = value;
                RaisePropertyChanged("SelectedVehicle");
            }
        }
    }
}

SelectedVehicle 的 setter 被正确调用,RaisePropertyChanged("SelectedVehicle"); ...

我的组合框

<ComboBox DisplayMemberPath="Number" 
          ItemsSource="{Binding Vehicles, UpdateSourceTrigger=PropertyChanged}" 
          SelectedValue="{Binding SelectedVehicle, UpdateSourceTrigger=PropertyChanged}" />

我也这样试过:

<ComboBox DisplayMemberPath="Number" 
           ItemsSource="{Binding Vehicles, UpdateSourceTrigger=PropertyChanged}" 
           SelectedItem="{Binding SelectedVehicle, UpdateSourceTrigger=PropertyChanged}" 
            IsSynchronizedWithCurrentItem="True" />

“手动”(通过 View )在 ComboBox 中选择一个值没有问题。通过在代码中“填充”ViewModel 来实现这一点是行不通的。

有人能帮忙吗?

最佳答案

因为你的属性SelectedVehicle是引用类型。
当您将 SelectedValue 绑定(bind)到 ViewModel.SelectedVehicle
组合框将有界集合的对象与 SelectedVehicle

的对象进行比较

通过调用 .Equals 方法进行比较,默认情况下比较引用,如果两个对象引用相同的内存地址则返回 true

因为未显示所选项目,我假设 SelectedVehicle 的引用不在集合 Vehicles 中。

您可以覆盖 Vehicle 类中的 Equals 方法,以通过某些属性进行比较。在您的情况下,这将是最短的方式。
SelectedItem View 中使用第二种方法并覆盖 Vehicle 类中的 Equals 方法:

public override bool Equals(Person compareTo)
{
    if (compareTo == null)
        return false;
    return (this.ID == compareTo.ID);
}

或者我更喜欢下一种方法
使用为 ValueMemberPath

标识 Vehicle 的属性
<ComboBox DisplayMemberPath="Number" 
      ValueMemberPath="Number"
      ItemsSource="{Binding Vehicles, UpdateSourceTrigger=PropertyChanged}" 
      SelectedValue="{Binding SelectedVehicle, UpdateSourceTrigger=PropertyChanged}" />

在 View 模型中

public Int32 SelectedVehicleNumber
{
    get { return PrimaryModel.Vehicle.Number; }
    set
    {
        if (PrimaryModel.Vehicle.Number != value)
        {
            PrimaryModel.Vehicle = New Vehicle(value);//Create instance by selected value
            RaisePropertyChanged("SelectedVehicle");
        }
    }
}

还有一种方法 KeyedCollection

关于c# - ComboBox 中的选定属性未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683649/

相关文章:

c# - ViewStateUserKey + 共享主机 + ViewStateMac 验证失败

c# - 如何解决此 System.IO.FileNotFoundException

c# - ComboBox 中的 ComboBox Item 被选中时的事件

WPF GroupBox 标题对齐问题

c# - UWP 中的设计时数据示例

c# - 如何添加应用栏分隔符

c# - 如何确定用户单击了 DataGridView 而不是 Cell

c# - 将 Javascript 用于 WPF 中的 Google map API

wpf - 如何在 WPF 中将字符串绑定(bind)为 double?

wpf - 打开窗口作为MVVM中的对话框