2009-07-27 9 views
11

Ok, c'est un peu bizarre mais c'est fondamentalement ce que j'ai besoin de faire. J'ai un contrôle WPF lié à un objet Document. L'objet Document a une propriété Pages. Donc, dans mon ViewModel, j'ai une propriété CurrentDocument et une propriété CurrentPage.WPF: Lier DisplayMemberPath dans une zone de liste déroulante à l'élément

Maintenant, j'ai un combobox que j'ai lié à la propriété CurrentDocument.Pages et met à jour la propriété CurrentPage.

<ComboBox ItemsSource="{Binding CurrentDocument.Pages}" 
    DisplayMemberPath="???" 
    SelectedItem="{Binding CurrentPage, Mode=TwoWay}"> 
</ComboBox> 

Avec-moi jusqu'à présent? Tout cela est très bien, sauf que je dois le DisplayMemberPath pour voir « Page 1 », « Page 2 », etc .....

J'ai essayé de créer un convertisseur comme celui-ci:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    string pageNumber = "Page {0}"; 
    return string.Format(pageNumber, value); 
} 

Et tenté de lier DisplayMemberPath à elle comme ceci:

DisplayMemberPath="{Binding RelativeSource={RelativeSource Self}, Path=Index, Converter={StaticResource pgTitleConv}}" 

Mais il ne serait pas apparaître dans le texte de zone de liste déroulante !!!

Il n'y a pas de propriété "Index" mais je ne sais pas comment faire ... Comment accéder à l'index de l'élément auquel la combobox est liée ... ??????

Répondre

24

essayez ceci:

<ComboBox.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding Converter={StaticResource pgTitleConv}}"/> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

et dans votre valueconverter, si vous pouvez accéder à la collection pages, vous pouvez utiliser CurrentDocument.Pages.IndexOf (valeur) pour obtenir l'index de l'élément lié. Je suis sûr qu'il y a une meilleure façon cependant.

+0

a fonctionné comme un charme pour ma situation. – JohnathanKong

+0

+1 Super tour! – Olwaro

+1

Fonctionne mais l'utilisation d'un convertisseur a un impact sur les performances. J'ai adapté ci-dessus pour utiliser la fonction StringFormat de liaison. par exemple. Darren

0

Ok, Merci à Botz3000 j'ai compris comment faire cela. (C'est un peu wiggy, mais ça marche bien.)

Soudain, il m'est venu à l'esprit: l'objet Page a un objet Document !! Doh !!

Alors, mon PageTitleConvert fait exactement ceci:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value != null) 
    { 
     ImGearPage page = (ImGearPage)value; 
     ImGearDocument doc = page.Document; 
     int pageIndex = doc.Pages.IndexOf(page); 
     pageIndex++; 
     return string.Format("Page {0}", pageIndex); 
    } 
    return null; 
} 
Questions connexes