2009-02-06 9 views
0

J'ai une zone de liste déroulante dans WPF qui est databound et possède un modèle de données qui contrôle comment chaque élément est affiché. J'ai fait en sorte que chaque élément soit affiché avec deux bits de texte (pour les propriétés Name et Path) et une image (pour la propriété Icon).Contrôler quel champ est affiché dans la zone de zone de texte d'une base de données WPF ComboBox

Au moment où je sélectionne un élément de la zone de liste déroulante, le bit de zone de texte de la zone de liste modifiable change simplement pour dire "TestWPF.Result" qui est le nom de la classe avec laquelle j'ai peuplé le ComboBox.

Je suis intéressé par un (ou les deux) de deux choses:

  1. Comment puis-je modifier afin qu'il affiche la valeur de l'un des champs là-bas (par exemple, il montre la valeur. du champ Nom plutôt que le nom de la classe)? Il est possible d'utiliser le même DataTemplate que dans la liste des éléments, de sorte que, une fois que j'ai sélectionné un élément, il s'affiche dans la zone de liste déroulante fermée de la même manière que dans la liste des éléments. Fondamentalement, j'ai un DataTemplate appelé ShowResults et un ComboBox qui utilise ce modèle. J'ai également ajouté dans un ContentControl séparé que je dois montrer les détails de l'élément sélectionné dans le ComboBox, mais je veux obtenir cela pour remplacer la zone de texte dans le ComboBox.

Mise à jour:

Merci pour la première réponse. J'ai essayé d'utiliser un ContentControl séparé, comme vous l'avez décrit, et cela fonctionne très bien. La question est maintenant de savoir comment remplacer la partie textbox du ComboBox par ContentControl. Tous les conseils à ce sujet seraient les bienvenus.

De même, est-il possible de remplacer le bit de zone de texte du contrôle ComboBox par ContentControl et une zone de texte, de sorte que je puisse toujours taper dans la zone de texte pour sélectionner des éléments dans ComboBox la liste déroulante le reste du bit ContentControl sera rempli avec le reste du texte et l'icône. J'espère que cela a du sens - posez des questions si ce n'est pas le cas!

code:

m'a demandé de poster mon code - si elle est ici. Je l'ai essayé d'enlever les choses que je connais ne sont certainement pas pertinentes, mais je ne sais pas exactement ce qui est pertinent si dans le doute, je l'ai laissé les choses.

<Window x:Class="TestWPF.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:custom="clr-namespace:TestWPF" 
Title="Window1" Height="300" Width="843" Loaded="Window_Loaded"> 
<Window.Resources> 
    <DataTemplate x:Key="ShowResult" DataType="TestWPF.Result"> 
     <StackPanel Margin="5" Orientation="Horizontal"> 
      <Image Width="32" Height="32" Source="{Binding Path=Image}"/> 
      <StackPanel Margin="5"> 
       <TextBlock FontWeight="Bold" Text="{Binding Path=Name}"/>      
       <TextBlock Text="{Binding Path=Path}"/> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<Grid Width="786"> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,24,166,0" Name="btnTest" VerticalAlignment="Top" Width="75" Click="btnTest_Click">Add</Button> 
    <ComboBox StaysOpenOnEdit="True" DropDownClosed="comboBox1_DropDownClosed" PreviewTextInput="comboBox1_PreviewTextInput" SelectionChanged="comboBox1_SelectionChanged" ItemTemplate="{StaticResource ShowResult}" Margin="259,109,22,89" Name="comboBox1" IsEditable="True" /> 
    <ContentControl Height="50" Margin="268,0,22,21" Name="contentControl1" VerticalAlignment="Bottom" Content="{Binding ElementName=comboBox1,Path=SelectedValue}" ContentTemplate="{StaticResource ShowResult}"/> 
</Grid> 

Répondre

0

Il suffit de placer la Expression de liaison de propriété à la zone de texte, vous n'avez pas besoin d'appliquer le modèle.

Une autre façon d'obtenir modèle de données exactes, placez un ContentControl dans le lieu de textBox et attribuer le même DataTemplate (par exemple x: Name = « robinTemplate »)

<ContentControl Content="{Binding ElementName=cmbBox,Path=SelectedValue}" ContentTemplate="{StaticResource robinTemplate}"/> 

Pour faire l'affichage de contenu sélectionné dans la De la même manière: Créez une copie du modèle de contrôle combobox et vous y trouverez un ContentPresenter. Remplacez cela par le ContentControl .. Ce n'est pas la bonne solution cependant.

+0

Merci pour la réponse. Comment vais-je placer le ContentControl à la place du TextBox? Avez-vous un exemple de code plus grand pour que je puisse voir comment faire cela? – robintw

+0

Je pense qu'il est préférable de poster votre code afin que je puisse le modifier et vous montrer. –

+0

Voilà, je l'ai posté maintenant. Merci pour l'aide continue :-) – robintw

1

La partie de liaison est liée à droite aux données et à l'aide d'un DataTemplate pour afficher la source comme vous le souhaitez.En ce qui concerne votre deuxième question, une façon de le faire serait d'utiliser un ComboBox avec IsEditable = "True" comme vous avez, et avec le gestionnaire d'événements TextChanged vérifier si le comboBox.Items contient la nouvelle valeur, sinon vérifier utiliser LINQ to seach pour un match:

 
if (comboBox.Items.Contains(e.NewValue)) 
    return;
var matches = with comboBox.Items select item where item.BeginsWith(e.NewValue);
if (matches.Count > 0) comboBox.SelectedItem = matches.First();