我需要一个自定义UserControl(带有标签,文本框,按钮等的StackPanel)用于事件之前和之后的数据输入(某些治疗) . 所以我想把一个UserControl放在一个Window上,一个属性说,一些标签的内容应该如何看,一些按钮应该如何反应以及TextBox的绑定应该如何 .
事实上,治疗有五种不同的模式,所以我需要五个自定义UserControl,它们在五个不同的Windows上放置两次 . 我想主要用XAML实现这一点 .
那是我到目前为止所尝试的:
我创建了一个附属属性:
public static class TherapyBeforeAfter
{
public static DependencyProperty _BeforeAfter = DependencyProperty.RegisterAttached("BeforeAfter", typeof(string),
typeof(TherapyBeforeAfter), new FrameworkPropertyMetadata("b", FrameworkPropertyMetadataOptions.AffectsRender,Callback));
private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.SetValue(_BeforeAfter, e.NewValue.ToString());
}
[AttachedPropertyBrowsableForType(typeof(DependencyObject))]
[AttachedPropertyBrowsableForChildren]
public static string GetBeforeAfter(DependencyObject d)
{
return (string)d.GetValue(_BeforeAfter);
}
public static void SetBeforeAfter(DependencyObject d, string value)
{
d.SetValue(_BeforeAfter, value);
}
}
在字典中,我使用触发器定义所需的样式,例如对于Label:
<Style x:Key="TherapyLabelHeader" TargetType="Label">
<Setter Property="FontSize" Value="16"/>
<Setter Property="Content" Value="Default" />
<Setter Property="Grid.ColumnSpan" Value="2"/>
<Setter Property="Margin" Value="10,0,0,0"/>
<Setter Property="Foreground" Value="DarkRed"/>
<Style.Triggers>
<Trigger Property="Namespace:TherapyBeforeAfter.BeforeAfter" Value="b">
<Setter Property="Content" Value="Therapy before" />
</Trigger>
<Trigger Property="Namespace:TherapyBeforeAfter.BeforeAfter" Value="a">
<Setter Property="Content" Value="Therapy after" />
</Trigger>
</Style.Triggers>
</Style>
在UserControl中,我们称之为cntTherapy,我将标签的样式设置为上面的模板:
<Label Style="{DynamicResource TherapyLabelHeader}" />
在MainWindow中,我将控件两次放入XAML-Code并设置附加属性的值:
<Namespace:cntTherapy x:Name="TherapyBefore" Grid.Row="1" Namespace:TherapyBeforeAfter.BeforeAfter="b" />
<Namespace:cntTherapy x:Name="TherapyAfter" Grid.Row="2" Namespace:TherapyBeforeAfter.BeforeAfter="a" />
当我运行Window时,两个标签都具有附加属性的默认值的内容 . 因此,当我将默认值设置为“a”时,两个标签都具有内容“Therapy after”,如果我将默认值设置为“b”,则两个标签都具有内容“之前的治疗” . 如果我将默认值设置为其他值(例如“x”),则两个标签都具有默认内容“Default” . 当我检查两个UserControls的附加属性的值时,值是正确的,一个UserControl有“a”,另一个“b” .
我错过了什么?我的PropertyChangedCallback方法错了吗?或者是否有另一种方法可以在XAML中实现这一目标?
1 回答
找到问题的解决方案:在字典中我正在寻找标签中附加属性的值 . 相反,必须检查附加属性的画布 .
甚至可以通过这种方式设置DataBinding .