繁体   English   中英

WPF-根据附加属性的值,以不同的设置重用UserControl

[英]WPF - reuse UserControl with different settings depending on value of attached property

我需要一个自定义的UserControl(带有标签,TextBox,Button等的StackPanel)用于事件前后的数据输入(某种疗法)。 因此,我想将该UserControl放在窗口上两次,并设置一个属性,说明某些标签的内容应如何显示,某些按钮应如何反应以及TextBoxes的绑定应该如何。

实际上,该疗法有五种不同的模式,因此我需要五个自定义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代码中,并设置附加属性的值:

<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”,则两个标签的内容均为“ Therapy before”。 如果我将默认值设置为其他值(例如,“ x”),则两个标签的默认内容均为“默认”。 当我检查两个UserControl的附加属性的值时,该值是正确的,一个UserControl具有“ a”,另一个具有“ b”。

我想念什么? 我的PropertyChangedCallback方法错误吗? 还是有另一种方法可以在XAML中实现这一目标?

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

<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也可以用这种方式设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM