2011-04-06 158 views
0

我有一個特性WPF風格

IEnumerable<Page> Pages { get; } 
Page CurrentPage { get; } 

視圖模型和我有XAML綁定像這樣:

<ItemsControl ItemsSource="{Binding Pages}" Margin="10"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <BulletDecorator> 
       <BulletDecorator.Bullet> 
        <TextBlock Text=" • " FontWeight="Heavy" /> 
       </BulletDecorator.Bullet> 

       <TextBlock Text="{Binding Title}" FontWeight="{Binding ????, Converter={StaticResource BTFWC}}" /> 
      </BulletDecorator> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

視圖模型具有性能PagesCurrentPage。無論何時頁面在視圖模型上設置爲CurrentPage,我都希望列表中的頁面文本爲加粗。我必須代替「????」在上面的XAML中實現該目的?我想避免在頁面上擁有「IsCurrent」屬性,因爲我覺得不知道它是否是當前頁面是它的責任。

P.S.:如果您想知道,BTFWC是一個「布爾到字體權重轉換器」。

回答

5

我希望頁是不是System.Windows.Controls.Page,因爲它不能被放置到ItemsControl的。

如果不是,您可以創建IMultiValueConverter它接受一個項目和當前頁的頁面:

public class IsCurrentToFontWeightConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Length == 2 && values[0] == values[1]) 
     { 
      return FontWeights.Bold; 
     } 

     return FontWeights.Normal; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

,並在下面的結合使用:

<TextBlock Text="{Binding Title}">        
    <TextBlock.FontWeight> 
     <MultiBinding> 
      <MultiBinding.Converter> 
       <local:IsCurrentToFontWeightConverter/> 
      </MultiBinding.Converter> 
      <Binding Path="."/> 
      <Binding Path="DataContext.CurrentPage" 
         RelativeSource="{RelativeSource AncestorType={x:Type ItemsControl}}"/> 
     </MultiBinding> 
    </TextBlock.FontWeight> 
</TextBlock> 
+0

謝謝,完美的解決方案。 – Alex 2011-04-06 12:30:45

1

試試這個

<TextBlock Text="{Binding Title}" FontWeight="{Binding DataContext.CurrentPage, 
    Converter={StaticResource BTFWC},RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type ItemsControl}}}" />