我创建了一个UserControl,其中包含一个Button。我将BorderThickness和BorderBrush属性添加到UserControl中,并使用RelativeSource.TemplatedParent映射到内部按钮。
我希望只有在UserControl上指定默认值时才能覆盖它们。此部分目前按预期工作。
<UserControl.Template>
<ControlTemplate>
<Button
BorderThickness="{Binding Path=BorderThickness, RelativeSource={x:Static RelativeSource.TemplatedParent}, FallbackValue=1,TargetNullValue=1}"
BorderBrush="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.TemplatedParent}, FallbackValue=Black,TargetNullValue=Black}"><Button>
<!-- ... -->
</ControlTemplate>
</UserControl.Template>我可以在我的BorderThickness上指定UserControl,并让它修改内部按钮的BorderThickness,但是默认行为会丢失。所有没有显式设置BorderThickness和BorderBrush的东西现在都没有边框。
我对FallbackValue和TargetNullValue有些熟悉,但正如您在上面看到的,它们都存在。
我不禁觉得这与BorderThickness有点不同的事实有关,因为您可以这样设置它,这就是FallbackValue和TargetNullValue的问题所在
BorderThickness="1"
BorderThickness="1 2"
BorderThickness="1 2 3 4"我也尝试过这样设置:
<Button>
<Button.BorderThickness>
<Binding Path="BorderThickness" RelativeSource="{x:Static RelativeSource.TemplatedParent}">
<Binding.TargetNullValue>
<Thickness>1</Thickness>
</Binding.TargetNullValue>
<Binding.FallbackValue>
<Thickness>1</Thickness>
</Binding.FallbackValue>
</Binding>
</Button.BorderThickness>
<Button>我怎样才能达到我想要的行为呢?目前,我可以重写,但默认值不被维护。
发布于 2021-04-01 08:00:13
TargetNullValue for BorderBrush工作,因为它的默认值是null,所以您只是看不到它,因为默认情况下BorderThickness为零。事实上,大多数绑定定义都是多余的。
FallbackValue,这里不是这种情况。您的模板父绑定应该总是成功的,因此您可以删除它。TargetNullValue for BorderThickness是无用的。null. Thickness是一个struct,而不是struct
如果希望仅为Button的默认值设置自定义默认值,则可以创建带有触发器的样式。TargetNullValue for BorderBrush也可以。
<UserControl.Template>
<ControlTemplate>
<ControlTemplate.Resources>
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="BorderBrush" Value="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.TemplatedParent}, TargetNullValue=Black}"/>
<Setter Property="BorderThickness" Value="{Binding Path=BorderThickness, RelativeSource={RelativeSource TemplatedParent}}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=BorderThickness, RelativeSource={RelativeSource TemplatedParent}}" Value="0">
<Setter Property="BorderThickness" Value="1"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ControlTemplate.Resources>
<Button Style="{StaticResource MyButtonStyle}"/>
<!-- ... -->
</ControlTemplate>
</UserControl.Template>注意,我已经将这两个属性提取到一个样式中,以使其在模板中可重用。如果您想在UserControl本身中设置默认值,这就更容易了,因为您不需要触发器。
<UserControl.Style>
<Style TargetType="{x:Type UserControl}" BasedOn="{StaticResource {x:Type UserControl}}">
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Button BorderThickness="{Binding Path=BorderThickness, RelativeSource={x:Static RelativeSource.TemplatedParent}}"
BorderBrush="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.TemplatedParent}}"/>
<!-- ... -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Style>https://stackoverflow.com/questions/66892589
复制相似问题