Стиль элемента WPF, основанный на свойствах родительского элемента

#.net #wpf #binding

#.net #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>
  

Модель представления имеет свойства Pages и CurrentPage . Я хочу, чтобы текст страницы в списке выделялся жирным шрифтом всякий раз, когда эта страница задана как CurrentPage в модели представления. Что я должен поставить вместо «????» в приведенном выше XAML для достижения этой цели? Я бы хотел избежать наличия свойства «IsCurrent» на самой странице, поскольку я чувствую, что в его обязанности не входит знать, является ли это текущей страницей или нет.

P.S.: BTFWC — это «преобразователь логического значения в вес шрифта», если вам интересно.

Ответ №1:

Я надеюсь, что эта страница не является системной.Windows.Элементы управления.Страница, потому что она не может быть помещена в ItemsControl.

Если это не так, вы можете создать IMultiValueConverter, который принимает страницу элемента и текущую страницу:

 public class IsCurrentToFontWeightConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length == 2 amp;amp; 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>
  

Ответ №2:

Попробуйте это

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