Как отладить привязку данных - PullRequest
0 голосов
/ 20 февраля 2012

Я новичок в привязке данных, и мне трудно настроить его для моего приложения WPF:

У меня есть класс Test, который реализует INotifyPropertyChanged, и свойство Text.

Когда я делаю это в коде позади:

Binding b = new Binding("Text");
b.Source = Test;
label1.SetBinding(ContentProperty, b);

все отлично работает.

Когда я делаю то же самое в XAML:

Content="{Binding Source=Window.Test, Path=Text}"

Содержимое метки не обновляется.

Я бы не хотел делать это в коде, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Самое простое решение - дать имя окну в XAML (например, root) и использовать ElementName для определения источника привязки:

Content="{Binding ElementName=root, Path=Test.Text}"
0 голосов
/ 21 февраля 2012

что я делаю не так?

Вы делаете необоснованные предположения о том, как что-то должно работать, о чем вы не особо понимаете.Здесь вы имеете дело с двумя принципиально разными языками и просто потому, что вы хотите, чтобы WPF интерпретировал Window.Test, поскольку ссылка на какое-то конкретное окно, которое вы имели в виду, не делает его таким.

XAMLосновывается на строках, по большей части строки преобразуются в примитивные типы, такие как int и double, например, когда вы устанавливаете высоту элемента управления, вы передаете string свойству типа double.Анализатор XAML знает через отражение, что свойство имеет тип double и пытается преобразовать string (используя конвертер значений по умолчанию , если не указано иное).Как вы думаете, что произойдет, если свойство имеет тип object?Что делать парсеру?Ну, он не собирается ничего делать, поскольку string уже уже object.

Угадайте, какой тип Binding.Source имеет и какой источникобъект вашей привязки будет при написании Window.Test ...

0 голосов
/ 20 февраля 2012

Для простоты установите для окна DataContext значение Test:

public partial class MainWindow : Window
{   
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new Test
            {
                Text = "Hello, World!"
            };
    }
}

Затем объявите привязку данных в XAML:

Content="{Binding Path=Text}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...