Xamlで複数の異なるプロパティをバインドしようとしています。
<Label Content="{Binding Description}"
Visibility="{Binding Path=DescriptionVisibility,
ElementName=_UserInputOutput}"
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}"
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" />
ここで、2つの異なるバインディングテクニックを使っていることにお気づきでしょう。 要素名を使ったものはうまくいき、もう一つはうまくいきません。以下はそのコードです。
public string Description
{
get { return (string)GetValue(DescriptionProperty); }
set { SetValue(DescriptionProperty, value); }
}
public static readonly DependencyProperty DescriptionProperty =
DependencyProperty.Register("Description", typeof(string), typeof(UserControl),
new UIPropertyMetadata(""));
それぞれのBindingは異なる名前を持っていますが、大部分はこのように見えます。 私はBindingが動作するようにしたいです。
{Binding Description}
の代わりに
{Binding Path=Description, ElementName=_UserInputOutput}
ElementNameが使われているときだけ動作しているようです。 このXAMLをエクスポート/インポートする必要があるので、ElementNameがないとインポートがうまくいきません'。
これがベストだと思いました。
{Binding Path=Description, RelativeSource={RelativeSource Self}}
これはうまくいきませんでした。
何かアイデアはありますか? ありがとうございます。
RelativeSource Self}は、バインドされているプロパティを所有するオブジェクトを対象とします。もし、
Labelにこのようなバインドを行った場合、
Label.Descriptionを探しますが、これは存在しません。代わりに、
{RelativeSource AncestorType=UserControl}` を使用する必要があります。
しかし、 UserControls
では、外部バインディングを混乱させないために、 DataContext
の設定を avoid する必要があります。
これは、RelativeSource が何に対して相対的であるかを決定するために使用するものです。UserControlのような、より高いレベルでDataContextを設定する必要があります。私は通常、次のようにしています。
<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
</UserControl>
これは、UserControlに、codebehindにあるクラス自身をバインドするように指示します。