2009-07-27 17 views
11

これは奇妙ですが、これは基本的に私がする必要があります。私はDocumentオブジェクトにバインドされているWPFコントロールを持っています。 DocumentオブジェクトにはPagesプロパティがあります。私のViewModelでは、私はCurrentDocumentプロパティとCurrentPageプロパティを持っています。WPF:コンボボックスのDisplayMemberPathをItemにバインドします

今、CurrentDocument.PagesプロパティにバインドしてCurrentPageプロパティを更新するコンボボックスがあります。

これまでの私とは?このすべてが.....など、私は「ページ1」を表示するようにDisplayMemberPathが必要であることを除いて

「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}}" 

ただし、それでもコンボボックスのテキストには表示されません。

「インデックス」プロパティはありませんが、これを行う方法がわかりません...コンボボックスがバインドしているアイテムのインデックスにアクセスするにはどうすればいいですか?

答えて

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

[OK]を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; 
} 
関連する問題