В шаблоне ItemTemplate ListBox-а использую userControl.
Подскажите, кто знает, почему не работает привязка к свойству в контроле?
Делаю так:
В окне:
<ListBox Name="listBox">
<ListBox.ItemTemplate>
<DataTemplate>
<l:MyControl Text="{Binding Path=Text}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var list = new List<MyClass>();
list.Add(new MyClass { Text = "текст" });
listBox.ItemsSource = list;
}
}
public class MyClass
{
public string Text {get; set;}
}
UserControl:
public partial class MyControl : UserControl
{
public readonly static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyControl));
public string Text
{
get
{
//Сюда почему-то не попадаем
return (string)GetValue(TextProperty);
}
set
{
//Сюда тоже не попадаем
if (Text != value)
SetValue(TextProperty, value);
}
}
public MyControl()
{
InitializeComponent();
}
}
Заранее спасибо.
VPP>VPP>public class MyClass
VPP>{
VPP> public string Text {get; set;}
VPP>}
VPP>
нет уведомления об изменении свойства
Здравствуйте, notacat, Вы писали:
N>нет уведомления об изменении свойства
Исправил:
public class MyClass : INotifyPropertyChanged
{
private string _text;
public string Text
{
get
{
return _text;
}
set
{
_text = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Но сожалению это не помогает.
VPP>Но сожалению это не помогает.
Вообще, в get и set и не должно попадать, если вы явно свойство не меняете. Байндинги напрямую используют GetValue и SetValue. Добавьте к своему DependencyProperty PropertyChangedCallback и отслеживайте изменения в этом методе.
А что именно не работает? Текст не отображается вообще или что именно? В вашем коде собственно изменений-то нету, только инициализация.
Здравствуйте, notacat, Вы писали:
VPP>>Но сожалению это не помогает.
N>Вообще, в get и set и не должно попадать, если вы явно свойство не меняете. Байндинги напрямую используют GetValue и SetValue. Добавьте к своему DependencyProperty PropertyChangedCallback и отслеживайте изменения в этом методе.
N>А что именно не работает? Текст не отображается вообще или что именно? В вашем коде собственно изменений-то нету, только инициализация.
Это был очень упрощенный пример.
Это был упрощенный пример.
И действительно помогло. Спасибо!
public partial class MyControl : UserControl
{
public readonly static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyControl), new FrameworkPropertyMetadata(OnTextChanged));
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyControl)d).Text = (string)e.NewValue;
}
public string Text
{
get
{
return (string)GetValue(TextProperty);
}
set
{
if (Text != value)
SetValue(TextProperty, value);
}
}
public MyControl()
{
InitializeComponent();
}
}
Здравствуйте, VetalPPC, Вы писали:
VPP>Здравствуйте, notacat, Вы писали:
VPP>>>Но сожалению это не помогает.
N>>Вообще, в get и set и не должно попадать, если вы явно свойство не меняете. Байндинги напрямую используют GetValue и SetValue. Добавьте к своему DependencyProperty PropertyChangedCallback и отслеживайте изменения в этом методе.
N>>А что именно не работает? Текст не отображается вообще или что именно? В вашем коде собственно изменений-то нету, только инициализация.
VPP>Это был очень упрощенный пример.
VPP>Это был упрощенный пример.
VPP>И действительно помогло. Спасибо!
Вообще, геттер и сеттер, как правильно заметила notacat, это синтаксический сахар для DependencyProperty.Нужен он для того, чтобы удобно использовать данные свойства в коде. Если вы планируете для свойства только привязку к XAML, геттер и сеттер не нужны.