在这上面浪费了几个小时之后,紧接着我的 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
的普通实体类)。 - 组合框的每种绑定(bind)模式。
ItemsSource="{Binding}"
Subsonic DAL 没有实现 INotifyPropertyChanged
,但我不认为它需要像这样的简单绑定(bind)。我只想能够从下拉列表中选择一些内容并保存。
将它与我的上一个问题(此消息顶部的链接)进行比较,我似乎对正在进行的数据源有一些非常奇怪的事情。也许这是亚音速的东西?
编辑: 出于某种原因,set 访问器仅在 AssetID 属性上命中,并且是第一次命中。 WPF 现在正在走向 WTF :)
编辑 2: 你一定是在跟我开玩笑 - 我已经删除了绑定(bind)(即它只有一个 displaymemberpath,一个 valuememberpath 和一个 itemsouce)而且它还在做!它接受您的第一个选择,然后不会改变。
最佳答案
如果在新选择的对象上调用的 object.Equals()
方法认为当前选择的项目和刚刚选择的项目相等,则 WPF 组合框不会更改选择的项目(即newlyslected.Equals(previoslySelected)
).
覆盖
绑定(bind)组合框项目的类上的Equals 方法
,应该可以解决您遇到的问题。
关于c# - WPF 组合框绑定(bind) : can't change selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962865/