2012-02-20 3 views
0

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

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

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

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

все прекрасно работает.

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

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

содержание Ярлык не обновляется.

Я хотел бы избежать необходимости делать это в коде, что я делаю неправильно?

+1

Посмотрите в вашем окне вывода, будет исключение, которое говорит вам, что пошло не так. –

ответ

1

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

Content="{Binding ElementName=root, Path=Test.Text}" 
+0

Решил мою проблему. Одна вещь, когда я пытаюсь использовать окно свойств для установки Контента, я выбираю ElementName для root, но Test не отображается в списке выбора, поэтому мне нужно ввести код вручную. Есть ли способ сделать это видимым, или это невозможно для этой ситуации? – user472875

+0

@ user472875, дизайнер видит, что 'root' имеет тип' Window', поэтому он ищет свойства, объявленные в классе 'Window', а не свойства, объявленные в вашем конкретном окне ... –

+0

Итак, я думал, спасибо – user472875

0

Для простоты установки окна DataContext к вашему Test например:

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

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

Content="{Binding Path=Text}" 
0

что я делаю неправильно?

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

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

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

Смежные вопросы