#.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}}}" />