【发布时间】:2016-04-21 15:46:42
【问题描述】:
我正在 Visual Studio 2015 中构建一个 MVVM Light WPF 应用程序,并使用实体框架 6 (EF) 提供数据。我有一个ComboBox,它显示了某人需要进行药物测试的原因,它看起来像这样:
<ComboBox ItemsSource="{Binding ReasonsForTest}"
SelectedItem="{Binding Path=ReasonsForTestVm,
UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Description" />
ReasonsForTest 的类型为 ReasonForTestViewModel 类:
public class ReasonForTestViewModel: ViewModelBase
{
private int _ReasonForTestId;
private string _ReasonForTestAbbr;
private string _description;
public int ReasonForTestId
{
get { return _ReasonForTestId; }
set
{
if (value == _ReasonForTestId) return;
_ReasonForTestId = value;
RaisePropertyChanged();
}
}
public string ReasonForTestAbbr
{
get { return _ReasonForTestAbbr; }
set
{
if (value == _ReasonForTestAbbr) return;
_ReasonForTestAbbr = value;
RaisePropertyChanged();
}
}
public string Description
{
get { return _description; }
set
{
if (value == _description) return;
_description = value;
RaisePropertyChanged();
}
}
}
我有一个数据服务类,它包含以下代码来获取ComboBox 的有效值的数据:
public async Task<ObservableCollection<ReasonForTestViewModel>> GetReasonsForTest()
{
using (var context = new MyEntities())
{
var query = new ObservableCollection<ReasonForTestViewModel>
(from rt in context.ReasonForTests
orderby rt.description
select new ReasonForTestViewModel
{
ReasonForTestId = rt.ReasonForTestID,
ReasonForTestAbbr = rt.ReasonForTestAbbr,
Description = rt.description,
});
return await Task.Run(() => query);
}
}
视图模型使用以下代码填充ComboBox:
var dataService = new TestDataService();
ReasonsForTest = await dataService.GetReasonsForTest();
ComboBox 的数据正确;但是,当应用程序启动时,它没有选择正确的值——加载时显示为空白。 SelectedItem (ReasonsForTestVm) 也是该类类型 ReasonForTestViewModel 并从数据库中填充此人的一项。我已逐步检查代码以确保 ReasonsForTestVm 具有正确的数据,并且确实如此。
这是ReasonsForTestVm 的属性:
public ReasonForTestViewModel ReasonForTestVm
{
get
{
return _reasonForTestVm;
}
set
{
if (Equals(value, _reasonForTestVm)) return;
_reasonForTestVm = value;
RaisePropertyChanged();
}
}
我在这里做错了什么?我快要疯了!
更新:对于上面属性中的混淆名称,我们深表歉意。固定。
【问题讨论】:
-
ItemsSource="{Binding ReasonsForTest}"-- 什么是ReasonsForTest?是ReasonForTestViewModel的集合吗?我们能看到那个和ReasonsForTestVm属性的声明吗?你说“ReasonsForTest 类是这样的”,但是你有一个ReasonForTestViewModel的定义。是不是打错字了? -
SelectedItem 应该始终是 ItemsSource 的实例。如果 SelectedItem 中的实例不在 ItemsSource 中,则 UI 不会按预期更新。
-
不,不一样的类型。仔细阅读:ItemsSource 中的 instance 必须在绑定到 SelectedItem 的集合中找到。例如,如果 SelectedItem 绑定到
public Items[] Foo { get; } = new[]{ new Item(), new Item() };,则必须将 Foo 中的项目之一用于 SelectedItem:SelectedItem = Foo[0];。如果您执行SelectedItem = new Item();,即使它们是等效的, UI 也不会按预期运行,因为在 ItemsSource 中找不到 SelectedItem 中的实例——它相当于实例之一,但它不是那个实例。 -
@Will,现在我明白了:所以
SelectedItem必须是填充 ComboBox 的 OC 的确切实例之一。现在它终于点击了!所以,我必须在ItemsSourceOC 中搜索应该选择的那个,然后将那个传递给SelectedItem。 -
是的,尝试一下,看看这是否是您的问题。抱歉,没有太多时间检查您的代码,但我认为这可能是问题所在。
标签: c# wpf entity-framework mvvm combobox