我的目的是为列表元素定义一个依赖属性Position
,以便在它们位于边缘时将它们样式不同。
我有一个依赖项属性(以及未显示的默认 get 和 set 方法):
public static readonly DependencyProperty PositionProperty =
DependencyProperty.RegisterAttached(
"Position",
typeof(Position),
typeof(ClientView),
new FrameworkPropertyMetadata(
Position.Normal));
a 选项卡控件:
<TabControl x:Name="Items" ItemContainerStyle="{DynamicResource 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);
}
}
}
};
当我运行此代码时,我可以调试这些事件并查看设置了正确的值,但它们从未出现在视图中。文本框的文本始终显示默认值"正常"。我在这里做错了什么?
如果像这样绑定绑定TextBlock.Text
属性怎么办
<TextBlock Text="{Binding
Path=(ClientView.Position),
RelativeSource={RelativeSource Mode=TemplatedParent}}" />
因为附加的属性是在样式化的 TabItem 上设置的,即TemplatedParent
.
编辑:如果您还通过绑定转换器设置Border.CornerRadius
属性,该绑定转换器从位置转换为适当的 CorderRadius 值,该怎么办:
<Border CornerRadius="{Binding
Path=(ClientView.Position),
RelativeSource={RelativeSource Mode=TemplatedParent},
Converter={StaticResource PositionToCornerRadiusConverter}}" />