2009-07-27 6 views
11

Ok, questo è un po 'strano ma questo è fondamentalmente ciò che devo fare. Ho un controllo WPF associato a un oggetto Document. L'oggetto Document ha una proprietà Pages. Quindi nel mio ViewModel, ho una proprietà CurrentDocument e una proprietà CurrentPage.WPF: associare DisplayMemberPath in una casella combinata all'elemento

Ora, ho una casella combinata che ho associato alla proprietà CurrentDocument.Pages e aggiorna la proprietà CurrentPage.

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

Con me finora? Tutto questo è bene, tranne che ho bisogno del DisplayMemberPath per mostrare "Page 1", "Pagina 2", ecc .....

Ho cercato di creare un convertitore come questo:

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

E cercato di legare DisplayMemberPath ad esso in questo modo:

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

Ma ancora non si presentava nel testo casella combinata !!!

Non esiste una proprietà "Indice" ma non so come farlo ... Come posso accedere all'indice dell'articolo che la casella combinata è vincolante per ... ??????

risposta

24

provare questo:

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

e nel tuo ValueConverter, se è possibile accedere alla collezione di pagine, è possibile utilizzare CurrentDocument.Pages.IndexOf (valore) per ottenere l'indice dell'elemento legato. Sono sicuro che c'è un modo migliore però.

+0

funzionato come un fascino per la mia situazione. – JohnathanKong

+0

+1 Grande trucco! – Olwaro

+1

Funziona ma l'utilizzo di un convertitore influisce sulle prestazioni. Ho adattato in precedenza per utilizzare la funzione StringFormat di associazione. per esempio. Darren

0

Ok, grazie a Botz3000 ho capito come farlo. (È un po 'wiggy, ma funziona bene.)

All'improvviso, mi è venuto in mente: l'oggetto Page ha un oggetto Document !! Doh !!

Quindi, il mio PageTitleConvert fa proprio questo:

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; 
}