2009-07-27 1 views
11

Хорошо, это немного странно, но это в основном то, что мне нужно сделать. У меня есть элемент управления WPF, связанный с объектом Document. Объект Document имеет свойство Pages. Поэтому в моей модели ViewModel у меня есть свойство CurrentDocument и свойство CurrentPage.WPF: Bind DisplayMemberPath в поле со списком к элементу

Теперь у меня есть поле со списком, которое я связал с свойством CurrentDocument.Pages и обновляет свойство CurrentPage.

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

Со мной до сих пор? Все это хорошо, за исключением, что мне нужно DisplayMemberPath, чтобы показать «Страница 1», «Страница 2» и т.д .....

Я попытался создать конвертер, такие как это:

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

И пытался связать DisplayMemberPath к ней, как это:

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

Но это все равно не будет отображаться в тексте комбинированного окна !!!

Нет свойства «Index», но я не знаю, как это сделать ... Как получить доступ к индексу элемента, связанного с привязкой к ... ??????

ответ

24

попробовать это:

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

и в вашем ValueConverter, если вы можете получить доступ к коллекции страниц, вы можете использовать CurrentDocument.Pages.IndexOf (значение), чтобы получить индекс связанного элемента. Я уверен, что есть лучший способ.

+0

работал как шарм для моей ситуации. – JohnathanKong

+0

+1 Отличный трюк! – Olwaro

+1

Работает, но с использованием преобразователя влияет на производительность. Я применил выше, чтобы использовать функцию привязки StringFormat. например. Darren

0

Хорошо, спасибо Botz3000 Я понял, как это сделать. (Это немного парик, но он отлично работает.)

Внезапно он пришел ко мне: объект страницы имеет объект Document !! Doh !!

Итак, мой PageTitleConvert просто делает это:

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