2016-03-20 2 views
1

J'essaie de créer une application pour gérer les données de base de données à l'aide de C#, WPF et Entity Framework (base de données d'abord). Pour apprendre ces méthodes, j'ai créé un petit exemple d'application qui utilise SQL Server et la base de données Northwind comme back end (voir le modèle dans cette image tinypic.com/r/1zl6d0x/9).Définition de la liaison pour la liste modifiable à l'aide de WPF et Entity Framework

J'ai créé un formulaire simple pour afficher les commandes et les détails de commande à l'aide de DataGrid. Maintenant, je veux utiliser combobox pour choisir le client pour la commande, mais j'ai du mal à mettre en place la recherche de combobox. Maintenant, la liste déroulante du client affiche une valeur erronée et si je change de valeur, la valeur sélectionnée est changée pour toutes les lignes (vu dans cette image tinypic.com/r/2mnejac/9).

le code moment pour la fenêtre principale est la suivante:

using System.Windows; 
using System.Windows.Data; 
using System.Data.Entity; 

namespace NorthTest 
{ 
    public partial class MainWindow : Window 
    { 
     NorthwindConnection context; 
     CollectionViewSource ordersViewSource; 
     CollectionViewSource customersViewSource; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      context = new NorthwindConnection(); 
      context.Orders.Load(); 
      context.Customers.Load(); 

      ordersViewSource = ((CollectionViewSource)(this.FindResource("ordersViewSource"))); 
      ordersViewSource.Source = context.Orders.Local; 

      customersViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("customersViewSource"))); 
      customersViewSource.Source = context.Customers.Local; 
     } 
    } 
} 

et XAML:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:NorthTest" 
     mc:Ignorable="d" 
     x:Class="NorthTest.MainWindow" 
     Loaded="Window_Loaded"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="ordersViewSource" /> 
     <CollectionViewSource x:Key="customersViewSource" /> 
     <CollectionViewSource x:Key="ordersOrder_DetailsViewSource" 
           Source="{Binding Order_Details, Source={StaticResource ordersViewSource}}" /> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource ordersViewSource}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="214*" /> 
      <RowDefinition Height="291*" /> 
     </Grid.RowDefinitions> 
     <DataGrid x:Name="ordersDataGrid" 
        AutoGenerateColumns="False" 
        EnableRowVirtualization="True" 
        ItemsSource="{Binding}" 
        RowDetailsVisibilityMode="VisibleWhenSelected"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn x:Name="orderIDColumn" 
             Header="Order ID" 
             Width="SizeToHeader"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding OrderID}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn x:Name="customerIDColumn" 
             Header="Customer ID" 
             Width="SizeToHeader"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{Binding Source={StaticResource customersViewSource}}" 
             DisplayMemberPath="CustomerID" 
             SelectedItem="{Binding Path=Customers}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn x:Name="customerIDColumn2" 
             Header="Customer ID2" 
             Width="SizeToHeader"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding CustomerID}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

     <DataGrid x:Name="order_DetailsDataGrid" 
        AutoGenerateColumns="False" 
        EnableRowVirtualization="True" 
        ItemsSource="{Binding Source={StaticResource ordersOrder_DetailsViewSource}}" 
        Grid.Row="1" 
        RowDetailsVisibilityMode="VisibleWhenSelected"> 
      <DataGrid.Columns> 
       <DataGridTextColumn x:Name="discountColumn" 
            Binding="{Binding Discount}" 
            Header="Discount" 
            Width="SizeToHeader" /> 
       <DataGridTemplateColumn x:Name="productIDColumn" 
             Header="Product ID" 
             Width="SizeToHeader"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox> 
           <ComboBoxItem Content="{Binding ProductID}" /> 
          </ComboBox> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTextColumn x:Name="quantityColumn" 
            Binding="{Binding Quantity}" 
            Header="Quantity" 
            Width="SizeToHeader" /> 
       <DataGridTextColumn x:Name="unitPriceColumn" 
            Binding="{Binding UnitPrice}" 
            Header="Unit Price" 
            Width="SizeToHeader" /> 
      </DataGrid.Columns> 
     </DataGrid>  
    </Grid> 
</Window> 

Comment configurer les liaisons et viewsources pour la table combobox/recherche de telle sorte que combobox montre bon client ?

J'ai fait des recherches sur google et par exemple. here et here mais je ne comprends pas (peut-être que je suis juste trop bête).

Répondre

0

(...) si je change la valeur en elle, la valeur sélectionnée est modifiée à toutes les lignes

Pour résoudre ce problème, je voudrais ajouter à combobox:

IsSynchronizedWithCurrentItem="False"