c# - WPF 组合框绑定(bind) : can't change selection

标签 c# wpf data-binding combobox

在这上面浪费了几个小时之后,紧接着我的 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"
  • 将组合框 ItemSourcesIQueryables 更改为 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/

相关文章:

c# - WPF 组合框 : Different template in textbox and drop-downlist

android - BR无法解决

c# - 如何在数据库更新后立即有效地从数据库中获取数据?

c# - 在 XAML 中而不是在代码隐藏中设置 DataContext

c# - 等待请求时任务等待问题

wpf - 如何绑定(bind)到 ListBox 的视口(viewport)宽度(即没有滚动条的宽度)?

wpf - DataGrid 中的 DatePicker 不更新绑定(bind)对象

c# - Entity Framework .edmx.sql 文件如何在已部署的应用程序中生成数据库?

c# - WPF Sentinel 对象以及如何检查内部类型

android - 使用数据绑定(bind)后查看边距不起作用