2012-04-23 3 views
1

Мое намерение состоит в том, чтобы определить свойство зависимостей 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); 
     } 
     } 
    } 
}; 

Когда я запускаю этот код, я могу отладить эти события и увидеть правильные значения установлены, но они никогда не появляются в представлении. Текст текстового поля всегда показывает «Обычный», который является значением по умолчанию. Что я здесь делаю неправильно?

+0

Попробуйте DataTrigger в вашем стиле, вместо триггера <Свойство DataTrigger – SvenG

+0

Выполнено '' также с '{Binding Position, RelativeSource = {RelativeSource AncestorType = {x: Тип client: ClientView}} } '. Оба провалились. – Vittel

ответ

0

Что делать, если вы свяжете связать TextBlock.Text свойство как этот

<TextBlock Text="{Binding 
    Path=(ClientView.Position), 
    RelativeSource={RelativeSource Mode=TemplatedParent}}" /> 

поскольку вложенное свойство устанавливается на стилизованной TabItem, т.е. TemplatedParent.

EDIT: Что делать, если вы установите Border.CornerRadius свойство, связывание с binding converter, который преобразует из позиции в соответствующее значение CorderRadius:

<Border CornerRadius="{Binding 
    Path=(ClientView.Position), 
    RelativeSource={RelativeSource Mode=TemplatedParent}, 
    Converter={StaticResource PositionToCornerRadiusConverter}}" /> 
+0

Это работает частично. TextBox показывает «Первый» и «Последний», но стиль углового радиуса не применяется. Я предположил, что это может быть проблема типа y и изменение перечня 'Position' для строки, но это тоже не удалось. ' <Свойство Setter =" CornerRadius "TargetName =" Bd "Значение = "4,0,0,0" /> ' – Vittel

+0

Да, в триггере' IsSelected', но нет «сброса» ' ' Редактировать: просто попытался удалить строку, но ничего не изменилось. – Vittel

+0

См. Отредактированный ответ для альтернативы триггеру. – Clemens