2013-09-09 3 views
1

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

Вот мой код в моем UI.xaml.cs

namespace mynamespace 
{ 
    class Customer 
    { 
    private string _name = "TEST"; 
    public string Name 
    { 
     get { return this._name; } 
     set { this._name = value; } 
    } 
    } 

    public partial class UI: UserControl 
    { 
     public UI() 
     { 
      InitializeComponent(); 
      Customer c = new Customer(); 
      this.DataContext = c; 
     } 
    } 
} 

код привязки (цель текстовое поле) выглядит следующим образом:

<TextBox Name="MyTextBox" Text="{Binding Path=Name}" /> 

Я ожидаю, что текстовое поле будет отображаться TEST, но это не так. В текстовом поле ничего нет. Документация (Обзор привязки данных, обзор деклараций привязок и обзор источников привязок) мне не очень понятна.

Это сообщение об ошибке в окне Output:

BindingExpression path error: 'Name' property not found on 'object' ''ConfigurationSettings' (HashCode=36012562)'. BindingExpression:Path=Name; DataItem='ConfigurationSettings' (HashCode=36012562); target element is 'TextBox' (Name='MyTextBox'); target property is 'Text' (type 'String') 
+4

Почему конструктор класса Window называется UI? Я думаю, что код не может компилироваться. –

+2

Класс клиента должен быть общедоступным? – JumpingJezza

+0

[Этот ответ] (http://stackoverflow.com/questions/7262137/what-is-datacontext-for) может оказаться полезным. – Nzc

ответ

0

Я такой идиот! У меня есть два конструктора, один по умолчанию и один параметризованный конструктор. Я вызывал параметризованный конструктор. После того, как я переведу код:

 Customer c = new Customer(); 
     this.DataContext = c; 

к параметризированному конструктору, все это сработало.

Благодарю вас за помощь и сожаление по поводу этой глупой ошибки.

0

Марио является правильным, поэтому вам код должен выглядеть следующим образом:

namespace mynamespace 
{ 
    class Customer 
    { 
    private string _name = "TEST"; 
    public string Name 
    { 
     get { return this._name; } 
     set { this._name = value; } 
    } 
    } 

    public partial class Window : UserControl 
    { 
     public Window() 
     { 
      InitializeComponent(); 
      Customer c = new Customer(); 
      this.DataContext = c; 
     } 
    } 
} 
+0

Марио был прав, я вырезал несвязанный код. Мы исправились, и он скомпилировался. (Я также редактирую вопрос так, чтобы он был согласован) – Unplug

0

Если клиент с является DataContext не должно ли быть :

<TextBox Name="MyTextBox" Text="{Binding Name}" /> 
0

Попробуйте реализовать интерфейс INotifyPropertyChanged и переопределитьв вашем Customer классе:

public class Customer : INotifyPropertyChanged 
{ 
    private string _name = "TEST"; 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; NotifyPropertyChanged("Name"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

Тогда если что еще не работает, попробуйте установить Name свойства со значением в Window конструкторе, а не частное поле внутренне:

public Window() 
{ 
    InitializeComponent(); 
    Customer c = new Customer() { Name = "TEST" }; 
    this.DataContext = c; 
} 
+1

Я думал, что реализация INotifyPropertyChanged - это когда вы хотите обновить цель и/или источник на лету. Поскольку имя было первоначально задано, я должен хотя бы увидеть ТЕСТ. Я действительно реализовал INotifyPropertyChanged, как вы предлагали, но все равно не уходите. – Unplug

+0

Интерфейс 'INotifyPropertyChanged' используется для обновления пользовательского интерфейса и/или источников данных * любых * изменений ... вам лучше привыкнуть к его использованию, если вы хотите написать WPF. :) – Sheridan