【发布时间】:2010-06-03 01:49:55
【问题描述】:
在我的Last Problem 之后浪费了几个小时之后,我开始觉得Framework 4 是微妙邪恶的大师,或者我的PC 闹鬼了。
我在 WPF 表单上有三个组合框和一个文本框,我有一个开箱即用的 Subsonic 3 ActiveRecord DAL。 当我加载这个“编辑记录”表单时,组合框填写正确,它们选择了正确的项目,并且文本框具有正确的文本。我可以更改 TextBox 文本并很好地保存记录,但无法更改组合框。列表下拉并突出显示,但是当您单击一个项目时,所选项目保持不变。
这是我的 XAML:
<StackPanel Orientation="Horizontal" Margin="10,10,0,0">
<TextBlock Width="80">Asset</TextBlock>
<ComboBox Name="cboAsset" Width="180"
DisplayMemberPath="AssetName"
SelectedValuePath="AssetID"
SelectedValue="{Binding AssetID}" ></ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10,10,0,0">
<TextBlock Width="80">Status</TextBlock>
<ComboBox Name="cboStatus" Width="180"
DisplayMemberPath="JobStatusDesc" SelectedValuePath="JobStatusID"
SelectedValue="{Binding JobStatusID}" ></ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10,10,0,0">
<TextBlock Width="80">Category</TextBlock>
<ComboBox Name="cboCategories" Width="180"
DisplayMemberPath="CategoryName"
SelectedValuePath="JobCategoryID"
SelectedValue="{Binding JobCategoryID}" ></ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10,10,0,0">
<TextBlock Width="80">Reason</TextBlock>
<TextBox Name="txtReason" Width="380" Text="{Binding Reason}"/>
</StackPanel>
以下是我的代码的相关片段(传入了 intJobID):
SvcMgrDAL.Job oJob;
IQueryable<SvcMgrDAL.JobCategory> oCategories = SvcMgrDAL.JobCategory.All().OrderBy(x => x.CategoryName);
IQueryable<SvcMgrDAL.Asset> oAssets = SvcMgrDAL.Asset.All().OrderBy(x => x.AssetName);
IQueryable<SvcMgrDAL.JobStatus> oStatus = SvcMgrDAL.JobStatus.All();
cboCategories.ItemsSource = oCategories;
cboStatus.ItemsSource = oStatus;
cboAsset.ItemsSource = oAssets;
this.JobID = intJobID;
oJob = SvcMgrDAL.Job.SingleOrDefault(x => x.JobID == intJobID);
this.DataContext = oJob;
我尝试过的事情:
- 显式设置
IsReadOnly="false"和IsSynchronizedWithCurrentItem="True" - 将组合框
ItemSources从IQueryables更改为Lists。 - 构建我自己的 Job 对象(使用
INotifyPropertyChanged的普通实体类)。 - 组合框的每种绑定模式。
ItemsSource="{Binding}"
Subsonic DAL 没有实现INotifyPropertyChanged,但我认为它不需要像这样的简单绑定。我只是希望能够从下拉列表中选择一些内容并将其保存。
将它与我的上一个问题(此消息顶部的链接)进行比较,我似乎对正在处理的数据源有一些非常奇怪的事情。也许这是亚音速的事情?
编辑: 出于某种原因,set 访问器仅在 AssetID 属性上被命中,并且仅在第一次被命中。 WPF 现在正走向 WTF :)
编辑 2: 你一定是在开玩笑吧——我已经删除了绑定(即它只有一个 displaymemberpath、一个 valuememberpath 和一个 itemssouce)而且它还在做!它接受您的第一个选择,然后不会更改。
【问题讨论】:
-
您是否尝试在
Job.AssetID的set 访问器中设置断点?是不是被击中了?当你通过时会发生什么?它真的改变了吗?也许它会引发异常? -
如果我使用 Subsonic DAL,它不会击中存取器。如果我使用自己的对象,它也不会击中它,但组合框周围会出现一个红色矩形...??
-
检查 - 红色异常矩形是我自己的对象中的类型错误(Int16 vs 32)。所以不,访问器没有被击中。
-
查看对我的回答的编辑,了解您的绑定可能有什么问题。
标签: c# wpf data-binding combobox