У меня есть 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
}
Спасибо всем за огромную помощь!