2010-05-19 3 views
1

J'ai lié une datatable à une liste déroulante et défini un dataTemplate dans itemTemplate.i peut voir les valeurs souhaitées dans la liste déroulante de la liste déroulante, ce que je vois dans le selectedItem est System.Data.DataRowView voici mes codes:Comment lier une datable à une liste déroulante modifiable wpf: selectedItem montrant System.Data.DataRowView

<ComboBox Margin="128,139,123,0" Name="cmbEmail" Height="23" VerticalAlignment="Top" TabIndex="1" ToolTip="enter the email you signed up with here" IsEditable="True" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}"> 

      <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
         <TextBlock Text="{Binding Path=username}"/> 
       </StackPanel> 

      </DataTemplate> 
     </ComboBox.ItemTemplate> 

le code est derrière ceci:

if (con != null) 
{ 
    con.Open(); 
    //users table has columns id | username | pass 
    SQLiteCommand cmd = new SQLiteCommand("select * from users", con); 
    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); 
    userdt = new DataTable("users"); 
    da.Fill(userdt); 
    cmbEmail.DataContext = userdt; 

} 

Je cherchais quelque chose comme SelectedValueTemplate ou SelectedItemTemplate faire le même genre de templating de données, mais Je n'en ai trouvé aucun.

Je voudrais demander si je fais quelque chose de mal ou c'est un problème connu pour la liaison combobox?
Si quelque chose ne va pas dans mon code, veuillez me diriger dans la bonne direction.
merci pour la lecture de ce

Répondre

1

j'ai reçu un formulaire de réponse msdn et il l'a fait pour moi

<ComboBox IsEditable="True" ItemTemplate="{StaticResource comboTemplate}" ItemsSource="{Binding}" TextSearch.TextPath="username"> 

la raison était

Depuis le ComboBox est réglé sur IsEditable = "true", et le ComboBox contient une zone de texte élément pour afficher la valeur sélectionnée. Mais l'élément dans le ComboBox est le type RowView; il montre l'information de type pas la valeur dans le TextBox.

avis les

+1

Je sais que c'est et vieille question, mais il serait plus facile de le lire lorsque vous fusionner vos réponses. – Tafari

3

Par défaut, la zone de liste déroulante appellera ToString() sur l'élément sélectionné pour obtenir une valeur pour montrer - puisque vous liez à un DataRowView le résultat est le type (le comportement par défaut de ToString ())

Qu'est-ce que vous voulez vraiment si vous faites cela, montrer la propriété nom d'utilisateur de l'élément sélectionné et pour ce faire, vous pouvez régler le DisplayMemberPath du combobox à « nom d'utilisateur »

(aussi, vous Vous constaterez probablement que vous pouvez également vous débarrasser du datatemplate personnalisé, car le nom d'utilisateur sera également utilisé pour remplir chaque élément.)


En réponse à votre commentaire:

Je ne veux pas être l'un des ces programmeurs, mais « il fonctionne sur ma machine ».

Mon XMAL est:

<ComboBox Name="cmbEmail" 
      Height="23" 
      VerticalAlignment="Top" 
      TabIndex="1" 
      ToolTip="enter the email you signed up with here" 
      IsEditable="True" 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding}" 
      DisplayMemberPath="username"> 
    </ComboBox> 

et mon code est derrière:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     Users = new DataTable("users"); 
     Users.Columns.Add("username"); 

     Users.Rows.Add(CreateDataRow("Fred")); 
     Users.Rows.Add(CreateDataRow("Bob")); 
     Users.Rows.Add(CreateDataRow("Jim")); 

     InitializeComponent(); 

     cmbEmail.DataContext = Users; 
    } 

    public DataTable Users { get; private set; } 

    private DataRow CreateDataRow(string userName) 
    { 
     DataRow dr = Users.NewRow(); 
     dr["username"] = userName; 

     return dr; 
    } 
} 
+0

merci pour l'tip.but il y a un problem.I a fait le bit DisplayMemberPath et a commenté la partie DataTemplate aussi. ce que j'ai comme résultat est la situation inverse où selectedItem montre correctement et la liste déroulante montrant le System.Data.DataRowView. J'ai essayé de les garder tous les deux comme en utilisant DisplayMemberPath et ItemTemplate mais j'ai attrapé et l'exception en disant que je ne peux pas les utiliser tous les deux. merci encore pour aider –

+0

Il doit y avoir quelque chose de mal avec mon environnement alors parce que le copier-coller de votre code donne la même chose que dans selectedItem montre correctement et la liste déroulante montrant System.Data.DataRowView. Quelqu'un d'autre peut-il essayer cela? merci –

0

Je l'ai découvert pourquoi il n'a pas été working.Using DisplayMemberPath ne fonctionnait pas, mais plutôt ItemTemplate. Voici un exemple.

<Window.Resources> 
    <DataTemplate x:Key="comboTemplate"> 
     <TextBlock Text="{Binding Path=username}" /> 
    </DataTemplate> 
</Window.Resources> 
<ComboBox Margin="18,121,24,0" Name="cmbEmail" Tag="email" TabIndex="1" ToolTip="enter the email you signed up with here" IsEditable="True" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource comboTemplate}" ItemsSource="{Binding}" Height="23" VerticalAlignment="Top" Style="{DynamicResource cmbBoxerrors}"> 
      <ComboBox.Text> 
       <Binding Path="username"/> 
      </ComboBox.Text>  
</ComboBox> 

Avis ItemTemplate

le code de xaml.cs n'a pas changé. merci pour ceux qui ont lu et suggéré des solutions pour moi.

Questions connexes