2012-08-16 8 views
13

私は私のXAMLで、いくつかの異なるプロパティをバインドしようとしています:RelativeSource Selfにどのようにバインドするのですか?

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"    
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}" 
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" /> 

あなたが、私はここに2つの異なる結合技術を使用していた気づいただろう。要素名を使用するものは動作し、もう1つは動作しません。ここにコードバックがあります。

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 Description} 

の代わりに:

{Binding Path=Description, ElementName=_UserInputOutput} 

それが唯一のElementNameを使用する場合に動作しているようです。このXAMLをエクスポート/インポートする必要があるため、ElementNameを使用できないか、インポートが機能しません。

私はこれが最善だろうと思った:

{Binding Path=Description, RelativeSource={RelativeSource Self}} 

これは動作しませんでした。

ありがとうございました!

+0

[この記事](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx)興味があるかもしれません。 –

答えて

26

RelativeSourceが相対的な内容を決定するために使用しているDataContextを設定していません。 UserControlのように、より高いレベルでDataContextを設定する必要があります。私は通常持っています:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
</UserControl> 

これは、コードビハインドでクラスをバインドするようにUserControlに指示します。

+0

あなたは素晴らしいです!!!!!!うわー!できます! –

+12

"これはRelativeSourceが相対的なものを判断するために使用しているものです。また、UserControlのDataContextを設定することはめったに良い考えではありません。 –

+2

MVVMのパラダイムに違反するので、これは良い考えではないと思います。私たちはMVVMでWPFを使用したいとき、ビューをViewModelにバインドします。したがって、ビューのコードのコンストラクタの内側で、 'View(){InitializeComponent(); DataContext =新しいViewModel(); } ' これはViewModel上ですべてのデータバインディング操作を実行するので、ViewModelからビューを分離することができます。 – codingdave

29

{RelativeSource Self}は、バインドされているプロパティを所有するオブジェクトをターゲットにしています。Labelにそのようなバインディングがある場合は、Label.Descriptionが見つかりません。代わりに{RelativeSource AncestorType=UserControl}を使用してください。ソースなし

バインディング(ElementNameSourceRelativeSourceが)しかし、外部バインディングとUserControlsあなたべきavoid setting the DataContextないと混乱で、DataContextを基準にしています。

関連する問題