Не работает привязка к UserControl-у
От: VetalPPC  
Дата: 18.11.10 12:33
Оценка:
В шаблоне 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();
    }
}


Заранее спасибо.
Re: Не работает привязка к UserControl-у
От: notacat  
Дата: 18.11.10 12:39
Оценка: +1
VPP>
VPP>public class MyClass
VPP>{
VPP>    public string Text {get; set;}
VPP>}
VPP>

нет уведомления об изменении свойства
Re[2]: Не работает привязка к UserControl-у
От: VetalPPC  
Дата: 18.11.10 13:19
Оценка:
Здравствуйте, 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;
}

Но сожалению это не помогает.
Re[3]: Не работает привязка к UserControl-у
От: notacat  
Дата: 18.11.10 13:26
Оценка:
VPP>Но сожалению это не помогает.
Вообще, в get и set и не должно попадать, если вы явно свойство не меняете. Байндинги напрямую используют GetValue и SetValue. Добавьте к своему DependencyProperty PropertyChangedCallback и отслеживайте изменения в этом методе.
А что именно не работает? Текст не отображается вообще или что именно? В вашем коде собственно изменений-то нету, только инициализация.
Re[4]: Не работает привязка к UserControl-у
От: VetalPPC  
Дата: 18.11.10 13:38
Оценка:
Здравствуйте, 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();
    }    
}
Re[5]: Не работает привязка к UserControl-у
От: Codechanger Россия  
Дата: 18.11.10 15:19
Оценка:
Здравствуйте, VetalPPC, Вы писали:

VPP>Здравствуйте, notacat, Вы писали:


VPP>>>Но сожалению это не помогает.

N>>Вообще, в get и set и не должно попадать, если вы явно свойство не меняете. Байндинги напрямую используют GetValue и SetValue. Добавьте к своему DependencyProperty PropertyChangedCallback и отслеживайте изменения в этом методе.
N>>А что именно не работает? Текст не отображается вообще или что именно? В вашем коде собственно изменений-то нету, только инициализация.
VPP>Это был очень упрощенный пример.

VPP>Это был упрощенный пример.

VPP>И действительно помогло. Спасибо!

Вообще, геттер и сеттер, как правильно заметила notacat, это синтаксический сахар для DependencyProperty.Нужен он для того, чтобы удобно использовать данные свойства в коде. Если вы планируете для свойства только привязку к XAML, геттер и сеттер не нужны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.