1

私の意図はPosition、list-elementsの依存関係プロパティを定義して、それらがエッジにある場合に異なるスタイルにすることです。

私は依存関係プロパティを持っています(表示されていないデフォルトのgetメソッドとsetメソッドとともに):

public static readonly DependencyProperty PositionProperty = 
  DependencyProperty.RegisterAttached(
    "Position", 
    typeof(Position), 
    typeof(ClientView),
    new FrameworkPropertyMetadata(
      Position.Normal));

TabControl:

<TabControl x:Name="Items" ItemContainerStyle="{DynamicResource TabItem}"/>

およびそれらのTabItemのテンプレート:

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

私のClientViewクラスのコードビハインドで、アイテムジェネレータがこれらのタブアイテムを作成したことを通知したときに、これらのプロパティを入力します。

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);
         }
      }
   }
};

このコードを実行すると、これらのイベントをデバッグして正しい値が設定されていることを確認できますが、ビューに表示されることはありません。テキストボックスのテキストには、デフォルト値である「通常」が常に表示されます。私はここで何が間違っているのですか?

4

1 に答える 1

0

TextBlock.Textこのようにプロパティをバインドバインドするとどうなりますか

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

添付されたプロパティはスタイル付きのTabItem、つまり。に設定されているためTemplatedParentです。

編集: Positionから適切なCorderRadius値に変換するバインディングコンバーターBorder.CornerRadiusを使用したバインディングによってプロパティを設定した場合はどうなりますか?

<Border CornerRadius="{Binding
    Path=(ClientView.Position),
    RelativeSource={RelativeSource Mode=TemplatedParent},
    Converter={StaticResource PositionToCornerRadiusConverter}}" />
于 2012-04-23T13:42:40.240 に答える