我有一个 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
<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/