我觉得这应该是一件简单的事,但显然我做的事情是愚蠢的。
我正在尝试使用UserControl
(枚举)创建一个DependencyProperty
来控制它是否只是逐字地显示其Content
属性中提供的文本,或者附加一些额外的文本。
用户控件:
<UserControl x:Class="Controls.UserControls.IndicatorLabel"
x:Name="indicatorLabel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:enum="clr-namespace:MyNamespace;assembly=EnumAssembly">
<Label>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Content, ElementName=indicatorLabel}" />
<TextBlock FontStyle="Italic"
Margin="5,0,0,0">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility"
Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IndicatorType}"
Value="{x:Static enum:LabelIndicator.Optional}">
<Setter Property="Text"
Value="(Optional)" />
<Setter Property="Visibility"
Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding IndicatorType}"
Value="{x:Static enum:LabelIndicator.Required}">
<Setter Property="Text"
Value="(Required)" />
<Setter Property="Visibility"
Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</Label>
</UserControl>
UserControl的代码隐藏:
public partial class IndicatorLabel : UserControl
{
public static DependencyProperty IndicatorTypeProperty = DependencyProperty.Register("IndicatorType", typeof(LabelIndicator), typeof(IndicatorLabel));
public LabelIndicator IndicatorType
{
get => (LabelIndicator)GetValue(IndicatorTypeProperty);
set => SetValue(IndicatorTypeProperty, value);
}
public IndicatorLabel()
{
InitializeComponent();
}
}
在另一个XAML页面中使用UserControl:
<uc:IndicatorLabel Grid.Row="4"
Content="Description"
IndicatorType="Optional" />
我希望看到:说明(可选)
事实上,只要设置了Content
属性,我就无法获得UserControl的XAML中的任何内容,只要有任何影响。
修改
我说它没有效果的原因是因为即使在第一个Text
的{{1}}属性中放置了一个文字字符串,TextBlock
属性中的任何内容仍会显示。好像两个Content
都没有真正显示出来。
那为什么会这样呢?难道不能使用TextBlock
属性作为将文本输入我真正想要显示的部分的方法吗?我在这里打破了关于Content
的WPF规则吗?
答案 0 :(得分:1)
首先关闭;是的,你不想使用Content
。你的UC 的XAML真正所说的是:
<UserControl>
<UserControl.Content>
... All that stuff
</UserControl.Content>
</UserControl>
因此,当您在父XAML中分配内容时,您只需覆盖所有内容。请改用其他属性(如“文本”)。如果不是UserControl
而是实际Control
(单独的ControlTemplate
和所有内容),那么您可以使用该名称
此外,{Binding IndicatorType}
正在查看继承的数据上下文。您应该将用户控件的数据上下文设置为自身,或使用x:Reference
告诉它查看用户控件本身。