Привязать свойство из-за головной боли кода

#data-binding #silverlight-4.0

#привязка данных #silverlight-4.0

Вопрос:

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

 public partial class DateListEditor : UserControl, INotifyPropertyChanged {
    private int _newMonth;
    public int newMonth {
      get { return _newMonth; }
      set { 
        if(value < 1 || value > 12)
          throw new Exception("Invalid month");
        _newMonth = value; 
        NotifyPropertyChanged("newMonth");
      }
    }

    public DateListEditor() {
        InitializeComponent();
        DataContext = this;
        newMonth = DateTime.Now.Month;
    }

    // ...
  

Затем в XAML:

 <TextBox x:Name="uiMonth" Text="{Binding newMonth, Mode=TwoWay, ValidatesOnExceptions=True}"/>
  

Эта штука работает. Оно предварительно заполнит текстовое поле текущим месяцем и подтвердит его, когда фокус будет потерян: отлично.

Но как я могу избежать строки XAML и делать все из кода? Кажется, я не могу разобраться с этим. Я пробовал этот код, но ничего не происходит:

   InitializeComponent();
  Binding b = new Binding("Text") {
    Source = newMonth,
    ValidatesOnExceptions = true,
    Mode = BindingMode.TwoWay,
  };
  uiMonth.SetBinding(TextBox.TextProperty, b);

  DataContext = this;
  

Как я могу это сделать, не устанавливая привязку в XAML?

Ответ №1:

Попробуйте изменить эту строку и посмотрите, поможет ли это

 //oldway    
Binding b = new Binding("Text")

//newway
Binding b = new Binding("newMonth")
  

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

Комментарии:

1. Большое спасибо! Я никогда не мог понять, куда куда идет элемент 🙂

Ответ №2:

1 там, и не забывайте об источнике:

 Binding b = new Binding("newMonth"){
  Source = this, // the class instance that owns the property 'newMonth'
  ValidatesOnExceptions = true,
  Mode = BindingMode.TwoWay,
};