2013-03-28 92 views
1

我需要一个自定义UserControl(StackPanel with Labels,TextBoxes,Buttons,...)用于事件前后的数据输入(某些治疗)。所以我想把这个UserControl放到一个Window上两次,一个属性说,一些标签的内容应该是怎样的,一些按钮应该如何反应以及TextBox的绑定应该如何。WPF - 根据附加属性的值重用UserControl的不同设置

实际上有五种不同的治疗模式,所以我需要五个自定义UserControls,它们放置在五个不同的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); 
    } 
} 

在一本字典,我定义与触发器所需要的款式,例如用于标签:

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

在用户控件,让我们把它cntTherapy,我一个标签的样式设置为上面的模板:

<Label Style="{DynamicResource TherapyLabelHeader}" /> 

在我把控制两倍到XAML码并设置附加属性值的主窗口:

<Namespace:cntTherapy x:Name="TherapyBefore" Grid.Row="1" Namespace:TherapyBeforeAfter.BeforeAfter="b" /> 
<Namespace:cntTherapy x:Name="TherapyAfter" Grid.Row="2" Namespace:TherapyBeforeAfter.BeforeAfter="a" /> 

当我运行的窗口,无论是标签有默认的内容附属财产的价值。因此,当我将默认值设置为“a”时,两个标签均具有“之后的治疗”内容,如果将默认值设置为“b”,则两个标签都具有“之前的治疗”内容。如果我将默认值设置为其他值(例如“x”),则两个标签都具有默认内容“默认”。当我检查两个UserControl的附加属性的值时,该值是正确的,一个UserControl具有“a”,另一个是“b”。

我错过了什么?我的PropertyChangedCallback方法是错误的吗? 或者有另一种方法可以在XAML中实现这一点吗?

回答

1

找到了问题的解决方案:在字典中,我正在寻找标签中附加属性的值。相反,必须为画布检查附加属性。

<Style x:Key="TherapyLabelHeader" 
     TargetType="{x:Type Label}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}, Path=(Namespace:TherapyBeforeAfter.BeforeAfter)}" 
        Value="b" > 

      <Setter Property="Content" 
        Value="before" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}, Path=(Namespace:TherapyBeforeAfter.BeforeAfter)}" 
        Value="a" > 
      <Setter Property="Content" 
        Value="after" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

即使是DataBinding也可以这样设置。