2012-06-15 8 views
0

J'ai un ComboBox avec 3 ComboBoxItems contenant chacun une image et du texte dans un panneau de pile. Je veux lier SelectedValue au texte TextBlock mais ne peut pas simplement lier au contenu car cela renvoie le panneau de pile. Comment lier la SelectedValue au contrôle TextBlock enfant? Je n'ai pas besoin de notifier quoi que ce soit d'autre J'ai juste besoin de la valeur SelectedValue pour retourner la chaîne.Liaison au contenu ComboBoxItem lorsque le contenu n'est pas simplement une chaîne WPF

<ComboBox> 
    <ComboBoxItem> 
    <StackPanel Orientation="Horizontal"> 
     <Image Source="ImagePath/Image.bmp"/> 
     <TextBlock Text="MyTextString"/> 
    </StackPanel> 
    </ComboBoxItem> 
</ComboBox> 

Répondre

1

SelectedValue est en fait une propriété liée à la liaison. Dans votre cas, vous créez statiquement des éléments de la zone de liste déroulante.

Cocher cette

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvaluepath.aspx

dans votre cas, vous pouvez ajouter propriété Tag sur ComboBoxItem

<ComboBox Height="40" x:Name="cmb" SelectedValuePath=""> 
      <ComboBoxItem Tag="MyTextString"> 
       <StackPanel Orientation="Horizontal" > 
        <Image Source="ImagePath/Image.bmp"/> 
        <TextBlock Text="MyTextString"/> 
       </StackPanel> 
      </ComboBoxItem> 
     </ComboBox> 

et l'accès dans le code

MessageBox.Show((cmb.SelectedItem as ComboBoxItem).Tag.ToString()); 
+0

Merci, c'est simple et fonctionne parfaitement, juste le genre de chose que je cherchais. Je peux voir le Tag utile à l'avenir aussi. – DanBrum

1

un moyen facile serait de maintenez vos informations coboboxitem dans une enveloppe et mettre une collection de ces wrapper comme source d'items de votre combobox.

public class MyComboboxData 
{ 
    public string MyImagePath { get; set; } 
    public string MyText { get; set; } 
} 

dans votre behind:

public ObservableCollection<MyComboboxData> MyData { get; private set; } 

    public MyViewWithCombobox() 
    { 
     InitializeComponent(); 

     this.MyData = new ObservableCollection<MyComboboxData>() 
          { 
           new MyComboboxData(){MyImagePath = "ImagePath/Image.bmp", MyText = "MyTextString"}, 
           new MyComboboxData(){MyImagePath = "ImagePath/Image2.bmp", MyText = "MyTextString2"} 
          }; 

     this.DataContext = this; 
    } 

maintenant, vous pouvez simplement lier à tout ce que vous voulez:

<Grid> 
    <ComboBox Name="comboBox1" ItemsSource="{Binding MyData}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding ImagePath}"/> 
        <TextBlock Text="{Binding MyText}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
    <TextBlock Text="{Binding ElementName=comboBox1, Path=SelectedItem.MyText}"/> 
</Grid> 

ps: jetez un oeil à MVVM avec viewmodel et lient ces tâches sont très facile à réaliser

+0

Merci pour la réponse, je peux voir pourquoi cela fonctionnerait. Je suis nouveau à WPF et trouve qu'il a une courbe d'apprentissage abrupte, mais en prenant le coup. J'ai utilisé MVVM dans d'autres situations mais je ne l'avais pas encore utilisé, il est évident maintenant et d'une certaine manière je pense que ce serait une meilleure pratique de programmation que la méthode que j'ai utilisée ci-dessous pour séparer les données de l'interface utilisateur. Cependant, cette boîte de dialogue est pour un cas très spécifique avec des options limitées, il est donc logique de créer les éléments de la liste déroulante de manière statique dans ce cas. – DanBrum

+0

tant que vous ne vouliez pas tester l'unité, vous pouvez aller l'autre - pas si mvvm façon;) – blindmeis

Questions connexes