Мне нужно настраивать UserControl (StackPanel с ярлыками, текстовыми полями, кнопками ...) для ввода данных (некоторая терапия) до и после события. Поэтому я хочу дважды добавить этот UserControl в окно, а свойство говорит, как должно выглядеть содержимое некоторых ярлыков, как некоторые из кнопок должны реагировать, а обязательным является текстовое поле.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>
в 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" />
Когда я запускаю окно, обе метки имеют содержание для по умолчанию значение прикрепленного имущества. Поэтому, когда я устанавливаю значение по умолчанию «a», обе метки имеют контент «Therapy after», если я установил значение по умолчанию «b», обе метки имеют контент «Therapy before». и если я установил значение по умолчанию на что-то другое (например, «x»), обе метки имеют контент по умолчанию «По умолчанию». Когда я проверяю значение вложенного свойства для обоих UserControls, значение верное, один UserControl имеет «a», другой «b».
Что мне не хватает? Является ли метод PropertyChangedCallback неправильным? Или есть другой способ добиться этого в XAML?