我需要一個自定義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中實現這一點嗎?