#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,
};