WPF 4 Datagrid与ComboBox

时间:2011-01-05 19:50:40

标签: wpf binding

我有一个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;
}

1 个答案:

答案 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")