Привязать свойство от головной боли кода - PullRequest
0 голосов
/ 14 апреля 2011

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

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?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

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

Binding b = new Binding("newMonth"){
  Source = this, // the class instance that owns the property 'newMonth'
  ValidatesOnExceptions = true,
  Mode = BindingMode.TwoWay,
};
2 голосов
/ 15 апреля 2011

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

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

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

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

...