2013-03-28 3 views
1

Мне нужно настраивать 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?

ответ

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 может быть установлен таким образом.

 Смежные вопросы

  • Нет связанных вопросов^_^