我有一个WPF 4应用程序,其中包含一个嵌入在DataGrid中的ComboBox。 ComboBox位于模板列中,在编辑模式下显示组合框,否则只显示文本框。如果我编辑单元格并从组合框中选择一个新值,则在离开单元格时,查看模式下的TextBlock不会反映新值。最终,新值将被保存并在刷新窗口时显示,但在网格中进行编辑时不会发生。
DB表结构如下:Employee(int employeeID,string last,string first,string phone); Project(int projectID,string projectName); ProjectMember(int projMemID,int projectID,int employeeID,string role)。一个readonly属性FullName被添加到连接第一个+ last的Employee实体。因此,视图TextBlock显示ProjectMember.Employee.FullName。组合框项目来自Employee.FullName。
以下是使这个更复杂的部分。网格和组合框绑定到与我的数据库绑定的EnityFramework中的不同ItemsSource。对于此问题,网格正在显示项目成员。可以从组合框中选择项目成员名称,组合框提供所有公司员工的列表。
关于如何在指向不同的DataSource时将DataGridColumnTemplate的视图模式与编辑值联系起来的任何想法?
相关XAML
<Window.Resources>
<ObjectDataProvider x:Key="EmployeeODP" />
</Window.Resources>
<StackPanel>
<DataGrid Name="teamProjectGrid" AutoGenerateColumns="false" ItemsSource="{Binding Path=ProjectMembers}"
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" x:Name="colProjectMember">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=ProjectMemberFullName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="ProjectMemberCombo" IsReadOnly="True"
DisplayMemberPath="FullName"
SelectedValue="{Binding Path=Employee}"
ItemsSource="{Binding Source={StaticResource EmployeeODP}}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn x:Name="colProjectRole" Binding="{Binding Path=ProjectRole}" Header="Role" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
背后的相关代码
this.DataContext = new MyEntityLibrary.MyProjectEntities();
ObjectDataProvider EmployeeODP= (ObjectDataProvider)FindResource("EmployeeODP");
if (EmployeeODP != null)
{
EmployeeODP.ObjectInstance = this.DataContext.Employees;
}
答案 0 :(得分:0)
只需更换组合框:
<ComboBox x:Name="ProjectMemberCombo" IsReadOnly="True"
DisplayMemberPath="FullName" SelectedValuePath="FullName"
SelectedItem="{Binding Path=Employee}"
SelectedValue="{Binding Path=ProjectMemberFullName}"
ItemsSource="{Binding Source={StaticResource EmployeeODP}}"
/>
此外,属性ProjectMemberFullName
必须引发事件PropertyChanged
。
另一种方式 - 替换TextBlock:
<TextBlock Text="{Binding Path=Employee.FullName}" />
您可以删除属性FullName:
<TextBlock DataContext="{Binding Employee}">
<Run Text="{Binding First}"/> <Run Text="{Binding Last}"/>
</TextBlock>
但我不确定该实体是否实现了INotifyPropertyChanged接口。
在第二个变体中,属性Employee必须调用OnNotifyPropertyChanged("Employee")