2

イベントの前後にデータ入力 (何らかの療法) を行うために、カスタム UserControl (ラベル、テキストボックス、ボタンなどを含む StackPanel) が必要です。そのため、その UserControl をウィンドウに 2 回配置したいと思います。プロパティは、一部のラベルのコンテンツがどのように表示されるか、一部のボタンがどのように反応し、TextBox のバインディングがどうあるべきかを示します。

実際、治療には 5 つの異なるパターンがあるため、5 つの異なる Windows に 2 回配置される 5 つのカスタム UserControls が必要です。主に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 コードに 2 回入れ、添付プロパティの値を設定します。

<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」など) に設定すると、両方のラベルのデフォルト コンテンツが「デフォルト」になります。両方の UserControls の添付プロパティの値を確認すると、値は正しく、1 つの UserControl には "a" があり、もう 1 つの UserControl には "b" があります。

私は何が欠けていますか?私の PropertyChangedCallback メソッドは間違っていますか? または、XAML でこれを達成する別の方法はありますか?

4

1 に答える 1

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 もこの方法で設定できます。

于 2013-05-29T08:06:45.670 に答える