2009-07-27 13 views
11

Ok, esto es un poco extraño, pero esto es básicamente lo que tengo que hacer. Tengo un control WPF que está vinculado a un objeto de documento. El objeto Documento tiene una propiedad de Páginas. Entonces, en mi ViewModel, tengo una propiedad CurrentDocument y una propiedad CurrentPage.WPF: Enlace DisplayMemberPath en un cuadro combinado al elemento

Ahora, tengo un combobox que he vinculado a la propiedad CurrentDocument.Pages y actualizo la propiedad CurrentPage.

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

¿Conmigo hasta ahora? Todo esto está muy bien, excepto que necesito el DisplayMemberPath para mostrar "Página 1", "Página 2", etc .....

intenté crear un convertidor como este:

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

Y tratado de obligar a DisplayMemberPath así:

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

Pero todavía no se presentaba en el texto cuadro combinado !!!

No hay propiedad de "índice" pero no sé cómo hacer esto ... ¿Cómo accedo al índice del elemento que el combobox es vinculante ... ??????

Respuesta

24

probar esto:

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

y en su valueconverter, si puede acceder a la colección de páginas, puede utilizar CurrentDocument.Pages.IndexOf (valor) para obtener el índice del elemento enlazado. Estoy seguro de que hay una mejor manera.

+0

funcionó de maravilla para mi situación. – JohnathanKong

+0

+1 ¡Gran truco! – Olwaro

+1

Funciona pero el uso de un convertidor afecta el rendimiento. Me adapté arriba para usar la función de enlace StringFormat. p.ej. Darren

0

Ok, gracias a Botz3000 descubrí cómo hacerlo. (Es un poco ondulado, pero funciona bien.)

De repente, se me ocurrió: ¡el objeto de página tiene un objeto de documento! ¡Doh!

lo tanto, mi PageTitleConvert sólo hace esto:

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