【问题标题】:WPF - reuse UserControl with different settings depending on value of attached propertyWPF - 根据附加属性的值重用具有不同设置的 UserControl
【发布时间】:2013-03-28 11:27:26
【问题描述】:

我需要一个自定义的用户控件(带有标签、文本框、按钮等的 StackPanel),用于事件前后的数据输入(一些治疗)。所以我想把那个 UserControl 两次放在一个窗口上,一个属性说,一些标签的内容应该看起来如何,一些按钮应该如何反应以及 TextBoxes 的绑定应该是什么。

事实上,治疗有五种不同的模式,所以我需要五个自定义的用户控件,它们被放置在五个不同的窗口上两次。 我想主要通过 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>

在UserControl中,我们称之为cntTherapy,我将Label的Style设置为上面的Template:

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

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

【问题讨论】:

    标签: c# wpf xaml wpf-controls attached-properties


    【解决方案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也可以这样设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2011-08-09
      • 2011-08-04
      相关资源
      最近更新 更多