2013-03-28 93 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也可以這樣設置。