Мое намерение состоит в том, чтобы определить свойство зависимостей Position
для элементов списка, чтобы они отличались друг от друга, если они находятся на границе.Приведенные значения свойств не передаются в стиль представления для первого/последнего элемента списка
У меня есть свойство зависимостей (наряду с его по умолчанию получить и установить методы, которые не показаны):
public static readonly DependencyProperty PositionProperty =
DependencyProperty.RegisterAttached(
"Position",
typeof(Position),
typeof(ClientView),
new FrameworkPropertyMetadata(
Position.Normal));
TabControl:
<TabControl x:Name="Items" ItemContainerStyle="{DynamicResource TabItem}"/>
и шаблон для тех TabItems:
<Style x:Key="TabItem" TargetType="{x:Type TabItem}">
... <Setter Property="Template"> <Setter.Value>
<Grid SnapsToDevicePixels="true">
<ControlTemplate TargetType="{x:Type TabItem}">
<Border x:Name="Bd">
<StackPanel Orientation="Horizontal">
<TextBlock
Text="{Binding Position, RelativeSource={RelativeSource
AncestorType={x:Type client:ClientView}}}"/>
<ContentPresenter x:Name="Content" ContentSource="Header"/>
</StackPanel>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="client:ClientView.Position" Value="Last">
<Setter Property="CornerRadius" TargetName="Bd" Value="0,0,0,4"/>
</Trigger>
...
На codebehind моего класса ClientView
, я заполняю эти свойства, когда t он элементы генератор говорит мне, что он создал эти tabitems:
var gen = Items.ItemContainerGenerator;
gen.StatusChanged += (sender, args) =>
{
if (gen.Status == GeneratorStatus.ContainersGenerated)
{
var cnt = Items.Items.Count;
if (cnt > 0)
{
if (cnt == 1)
{
gen.ContainerFromItem(Items.Items[0])
.SetValue(PositionProperty, Position.Normal);
}
else
{
gen.ContainerFromItem(Items.Items[0])
.SetValue(PositionProperty, Position.First);
if (cnt > 2)
{
for (int i = 1; i < cnt - 2; i++)
{
gen.ContainerFromItem(Items.Items[i])
.SetValue(PositionProperty, Position.Normal);
}
}
gen.ContainerFromItem(Items.Items[cnt - 1])
.SetValue(PositionProperty, Position.Last);
}
}
}
};
Когда я запускаю этот код, я могу отладить эти события и увидеть правильные значения установлены, но они никогда не появляются в представлении. Текст текстового поля всегда показывает «Обычный», который является значением по умолчанию. Что я здесь делаю неправильно?
Попробуйте DataTrigger в вашем стиле, вместо триггера <Свойство DataTrigger –
SvenG
Выполнено '' также с '{Binding Position, RelativeSource = {RelativeSource AncestorType = {x: Тип client: ClientView}} } '. Оба провалились. –
Vittel