2009-07-27 7 views
11

OK, to jest trochę dziwne, ale to jest w zasadzie to, co muszę zrobić. Mam kontrolkę WPF, która jest powiązana z obiektem dokumentu. Obiekt Document ma właściwość Strony. Tak więc w moim ViewModelu mam właściwość CurrentDocument i właściwość CurrentPage.WPF: Powiąż DisplayMemberPath w combobox z pozycją

Teraz mam combobox, który związałem z właściwością CurrentDocument.Pages i aktualizuję właściwość CurrentPage.

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

Ze mną do tej pory? Wszystko to jest w porządku, poza tym, że muszę DisplayMemberPath aby wyświetlić "Page 1", "Page 2", itd .....

Próbowałem tworzenia konwerter taki jak ten:

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

I próbował związać DisplayMemberPath z tym tak:

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

Ale nadal nie pojawił się w tekście pola kombi !!!

Nie ma właściwości "Index", ale nie wiem jak to zrobić ... Jak uzyskać dostęp do indeksu elementu, który jest wiążący combobox ... ??????

Odpowiedz

24

spróbuj tego:

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

iw swoim valueconverter, czy można uzyskać dostęp do kolekcji stron, można użyć CurrentDocument.Pages.IndexOf (wartość), aby uzyskać indeks elementu związanego. Jestem pewien, że jest lepszy sposób.

+0

pracował jak czar o mojej sytuacji. – JohnathanKong

+0

+1 Świetna sztuczka! – Olwaro

+1

Działa, ale używanie konwertera wpływa na wydajność. Dostosowałem się powyżej, aby użyć wiążącej funkcji StringFormat. na przykład. Darren

0

OK, dzięki Botz3000 zorientowałem się, jak to zrobić. (Jest trochę wiggy, ale działa dobrze.)

Nagle przyszło mi: obiekt strony ma obiekt Document !! Doh !!

Więc moje PageTitleConvert właśnie to robi:

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