Saya mencoba untuk mengikat beberapa properti yang berbeda di Xaml saya:
<Label Content="{Binding Description}"
Visibility="{Binding Path=DescriptionVisibility,
ElementName=_UserInputOutput}"
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}"
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" />
Anda akan melihat bahwa saya menggunakan dua teknik pengikatan yang berbeda di sini. Yang satu menggunakan Element Name, yang lain tidak. Berikut adalah kode di belakangnya:
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(""));
Setiap Binding memiliki nama yang berbeda, namun secara garis besar terlihat seperti ini. Saya ingin Binding saya dapat digunakan:
{Binding Description}
Bukannya:
{Binding Path=Description, ElementName=_UserInputOutput}
Sepertinya hanya berfungsi ketika ElementName digunakan. Saya perlu mengekspor/mengimpor XAML ini, jadi saya tidak bisa memiliki ElementName atau impor tidak akan berhasil.
Saya pikir ini akan menjadi yang terbaik:
{Binding Path=Description, RelativeSource={RelativeSource Self}}
Ini tidak berhasil.
Ada ide? Terima kasih!
{RelativeSource Self}
menargetkan objek yang memiliki properti yang sedang diikat, jika Anda memiliki pengikatan seperti itu pada Label
maka akan mencari Label.Description
, yang tidak ada di sana. Sebagai gantinya, Anda harus menggunakan {RelativeSource AncestorType = UserControl}
.
Binding tanpa sumber (ElementName
, Source
, RelativeSource
) bersifat relatif terhadap DataContext
, namun dalam UserControl
Anda harus menghindari pengaturan DataContext
untuk tidak mengacaukan binding eksternal.
Anda belum mengatur DataContext, yang digunakan RelativeSource untuk menentukan apa yang menjadi relasinya. Anda perlu mengatur DataContext pada tingkat yang lebih tinggi, seperti UserControl. Saya biasanya melakukannya:
<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
</UserControl>
Ini memberitahu UserControl untuk mengikat dirinya sendiri dengan kelas di dalam kode.