У меня есть UserControl, который я хочу участвовать в привязке данных. Я настроил свойства зависимостей в пользовательском элементе управления, но не могу заставить его работать.
Uc отображает правильный текст, когда я вызываю его статическим текстом (например, BlueText = "ABC"). Когда я пытаюсь привязать его к локальному общедоступному свойству, он всегда остается пустым.
<src:BlueTextBox BlueText="Feeling blue" /> <!--OK-->
<src:BlueTextBox BlueText="{Binding Path=MyString}" /> <!--UserControl always BLANK!-->
<TextBox Text="{Binding Path=MyString}" Width="100"/> <!--Simple TextBox Binds OK-->
Я свел код к следующему упрощенному примеру. Вот XAML UserControl:
<UserControl x:Class="Binding2.BlueTextBox" ...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
Вот код UserControl:
public partial class BlueTextBox : UserControl
{
public BlueTextBox()
{
InitializeComponent();
DataContext = this; // shouldn't do this - see solution
}
public static readonly DependencyProperty BlueTextProperty =
DependencyProperty.Register("BlueText", typeof(string), typeof(BlueTextBox));
public string BlueText
{
get { return GetValue(BlueTextProperty).ToString(); }
set { SetValue( BlueTextProperty, value.ToString() ); }
}
Кажется, это должно быть очень просто, но я не могу заставить это работать. Спасибо за вашу помощь!
Дополнительная информация: Когда я пробовал исправление, предложенное Юджином, я заметил странное поведение. Я добавил PropertyChangedCallback к метаданным; это позволяет мне наблюдать за установкой значения BlueText. При установке для строки статического значения (= "ощущение синего") возникает событие PropertyChanged. Случай привязки данных не запускает PropertyChanged. Я думаю, это означает, что значение с привязкой к данным не отправляется в UserControl. (Я думаю, что конструктор не вызывается в статическом случае)
Решение. Проблемы были правильно определены Arcturus и jpsstavares. Во-первых, я перезаписывал привязку данных, когда в конструкторе элемента управления задано значение DataContext = this. Это препятствовало установке значения привязки данных. Мне также пришлось назвать элемент управления x: Name = root и указать Binding ElementName = root в XAML. Чтобы получить привязку TwoWay, мне нужно было установить Mode = TwoWay в вызывающей стороне. Вот правильный код:
<src:BlueTextBox BlueText="{Binding Path=MyString, Mode=TwoWay}}" /> <!--OK-->
Теперь XAML в UserControl:
<UserControl x:Class="Binding2.BlueTextBox" x:Name="root"...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding ElementName=root, Path=BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
Наконец, я удалил DataContext = this в конструкторе UserControl.
public BlueTextBox()
{
InitializeComponent();
//DataContext = this; -- don't do this
}
Спасибо всем за огромную помощь!