C# 如何将wpf组合框绑定到Linq to SQL外键属性

C# 如何将wpf组合框绑定到Linq to SQL外键属性,c#,wpf,linq-to-sql,xaml,data-binding,C#,Wpf,Linq To Sql,Xaml,Data Binding,我有一个Linq to SQL EntitySet,两个表之间有外键关系。讨论中的表是任务表(称为问题)和部门表。外键是部门名称(保证唯一)。我遇到了一个问题,即如果加载了相应的数据,则无法将Linq更改为SQL FK字段 ViewModel(不是真正的MVVM,我在学习xaml、WPF和LINQSQL的同时尝试实践这些概念) 到组合框,然后使用以下代码删除部门引用,然后添加新引用。它似乎工作得很好,但我发现,如果过滤器设置导致linq查询被更改,那么更改前的当前项在选择\u changed事件

我有一个Linq to SQL EntitySet,两个表之间有外键关系。讨论中的表是任务表(称为问题)和部门表。外键是部门名称(保证唯一)。我遇到了一个问题,即如果加载了相应的数据,则无法将Linq更改为SQL FK字段

ViewModel(不是真正的MVVM,我在学习xaml、WPF和LINQSQL的同时尝试实践这些概念)

到组合框,然后使用以下代码删除部门引用,然后添加新引用。它似乎工作得很好,但我发现,如果过滤器设置导致linq查询被更改,那么更改前的当前项在选择\u changed事件触发时将其部门更改为新默认项部门的值。我无法找到一种方法来判断selection changed事件是否来自用户,而不是binding属性,以防止出现这种情况。除此之外,我对代码的使用并不满意,因为它似乎应该在绑定中,或者至少在某种值转换器中使用

// This was an attempt to work around that did not work
// The referneces are passed from the Window1 event handler
public void ChangeDepartment(Issue currentIssue, Department currentDept)
{
    if (currentIssue != null) {
        currentIssue.Department = null;
        currentIssue.Department = currentDept;
    }
}
我必须对自己说实话,我在这里的薪水超过了我的等级,但那是你学到最多的时候,嗯

我该怎么处理?我读了十几篇关于这个问题的文章,发现它们相互矛盾,一目了然

谢谢你这么多的帮助

迈克

更新 我在下面与克里斯·尼科尔进行了一次非常有用的讨论,如果我能更好地处理事情,他可能已经有了复选标记。我认为我最大的问题是我必须同时学习SQL、Linq、WPF和数据库设计。我有关于所有主题的优秀书籍,但它们不涉及互操作。例如,2008年C#。。。除了WPF中根本没有提到Linq

我试着尽可能地做一些“MVVMish”的事情,但是,在之前的几次错误的开始之后,我认为这是一件太多的事情,一下子就要学会。实际上,我认为我接近MVVM,除了没有命令之外,我从代码隐藏中的事件处理程序执行ViewModel类中的方法。我假设这将使以后在命令结构中进行重构变得相当容易。我的应用程序结构如下:

模型

  • Linq到SQL dbml文件
  • DataErrorInfo验证的分部类
视图模型

  • 数据上下文
  • 任务、员工和部门的IQueryable集合
  • “添加/编辑windows”视图使用的选定任务属性
  • 视图要绑定到的某些属性,例如ShowDetailListItems(),它触发不同的listbox ItemTemplate,并且自身绑定到复选框
  • 执行查询的方法
  • 方法打开窗口以添加或编辑任务,并在从所述窗口返回时提交更改()
视图已绑定到viewmodel,隐藏的代码包含:

  • 包含一个实例的属性 viewmodel类
  • 用于在构造函数中实例化viewmodel并将datacontext设置为viewmodel的代码
  • 代码背后的其余部分是事件处理程序,最终将由命令替换
我已经多次阅读Josh Smith的优秀文章,并探索了示例代码。我的大部分格式都基于此。Chris(以下)列出的线程有很多或更多的新材料需要我去探索,所以我将花一些时间深入研究,并试图确定如何最好地重构。这远远超出了某些组合框不起作用的范围,事实上,原始问题的一部分是组合框被绑定到两个不同的数据上下文。在我有一个可管理的架构之前,我认为我正在做的弊大于利试图修补东西

我可能稍后会回来给克里斯打勾


Grrr:“已尝试附加或添加非新实体,可能是从另一个DataContext加载的……”

我建议将数据访问层与ViewModel分离,并使用可观察的集合。一旦你更好地利用MVVM,这类事情就不那么难了

我建议您阅读,它将使您对WPF及其绑定功能有一个深刻的了解。一旦您了解了WPF的工作原理,就可以很容易地完成您在WPF中要做的事情


祝你好运

好的,我做了这项工作,但解决方案是如此的一个horible黑客我畏缩。使用文章末尾的事件,我向类“UpdatengQuery”添加了一个属性,然后在进行查询更改时将其设置为true。然后,我在ChangeDepartment中添加了一个检查,以排除更新过程中的更改。哎哟,我真的需要找到正确的方法,我讨厌学习坏习惯!如果我理解,那么我需要同时保留一个IQueryable来管理Linq和一个ObservableCollection来绑定到?任何时候对数据库进行更改时,都会对IQueryable进行更改,然后使用IQueryable的新副本覆盖ObservableCollection?是。。。或者你可以将它进一步分离,在ObservableCollection和IQueryable之间有一个层,这将是你在坚持之前收集一个工作单元的层。你能建议对此进行一些阅读吗?到目前为止,我的重构尝试导致了很多“尝试附加或添加一个非新实体,可能是从另一个DataContext加载的……”例外情况是我需要查询数据,设置ObservableCollection进行绑定,然后,如果进行了更改,创建一个新DataContext,从中查询数据,然后将更改应用到该数据集并执行SubmitChanges()?现在,即使是对db.GetChangeSet()的调用也会引发异常(这对我来说似乎很奇怪,因为GetChangeSet()没有改变任何东西),只有在我放弃并替换了DataContext之后才会发生错误。在那之前一切似乎都很好,乔希·史密斯
<ComboBox x:Name="DeptComboBox" 
  ItemsSource="{Binding Departments}" 
  DisplayMemberPath="DeptName"
  SelectedValuePath="DeptName"
  SelectedValue="{Binding Path=Issues/IssDepartment, Mode=TwoWay}"
  Grid.Column="2" Grid.ColumnSpan="2" Grid.Row="3" Margin="6,7,115,5"
  IsSynchronizedWithCurrentItem="True" /> 
   SelectionChanged="DeptComboBox_SelectionChanged" 
// This was an attempt to work around that did not work
// The referneces are passed from the Window1 event handler
public void ChangeDepartment(Issue currentIssue, Department currentDept)
{
    if (currentIssue != null) {
        currentIssue.Department = null;
        currentIssue.Department = currentDept;
    }
}