как получить значение текстового поля и попытаться использовать его как int с привязкой?
<TextBox Text = "{Binding SelectedAmount}"/>
Я пробовал вот так, но значение привязки равно 0
public string SelectedAmount
{
get { return _selectedAmount; }
set { _selectedAmount = value; }
}
Это мой основной класс, но значение текстового поля остается равным 0, оно не меняется.
общедоступный частичный класс MainWindow: Window {
int deposit;
int weeks;
int total;
public MainWindow()
{
InitializeComponent();
this.DataContext = new MyClass();
}
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public int _selectedAmount;
public int SelectedAmount
{
get
{
return this._selectedAmount;
}
set
{
if (value != this._selectedAmount)
{
this._selectedAmount = value;
NotifyPropertyChanged();
}
}
}
}
public void BtnCompute_Click_1(object sender, RoutedEventArgs e)
{
MyClass ff = new MyClass();
int cc = ff.SelectedAmount;
deposit = cc;
}
}
}
публичная строка SelectedAmount {получить {return _selectedAmount; } установить {_selectedAmount = значение; }} частная строка _selectedWeeks;
поэтому привязка не работает, потому что свойство не поддерживает привязку.
Я пробовал ваше решение, но оно не работает
тогда я предлагаю сначала прочитать некоторые основы





Вы можете без труда привязать Text к int.
При использовании привязок вы должны либо унаследовать класс, содержащий привязываемые свойства, от интерфейса INotifyPropertyChanged или класса DependencyObject. в противном случае привязка будет показывать только значения по умолчанию (начальные).
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public int _selectedAmount;
public int SelectedAmount
{
get
{
return this._selectedAmount;
}
set
{
if (value != this._selectedAmount)
{
this._selectedAmount = value;
NotifyPropertyChanged();
}
}
}
}
или же
public class MyClass : DependencyObject
{
/// <summary>
/// Gets or Sets SelectedAmount Dependency Property
/// </summary>
public int SelectedAmount
{
get { return (int)GetValue(SelectedAmountProperty); }
set { SetValue(SelectedAmount Property, value); }
}
public static readonly DependencyProperty SelectedAmountProperty =
DependencyProperty.Register("SelectedAmount ", typeof(int), typeof(MyClass), new PropertyMetadata(0));
}
также не забудьте установить DataContext вашего представления.
//in view's constructor:
this.DataContext = new MyClass();
или же
<UserControl>
<UserControl.DataContext>
<vm:MyClass/>
</UserControl.DataContext>
</UserControl>
Вы забыли Mode=TwoWay
@AnthonyRussell В этом нет необходимости, потому что режим привязки по умолчанию для элементов управления вводом, таких как TextBox, - TwoWay.
_selectedAmount не требует инициализации, int по умолчанию имеет значение 0 :). Я не вижу смысла проверять значение поля в установщике свойства ... Свойство не уведомляет, если нет изменений (AFAIK). Не уверен, что установка Datacontext для UserControl через XAML - хорошая идея ... как получить доступ к данным экземпляра? Я также не стал бы определять Props как свойства зависимостей в ViewModel, вам понадобится дополнительный обработчик для каждого Prop в виртуальной машине, чтобы уловить изменение и запустить логику. Но это может быть больше дело вкуса .... Без заборов, я рад узнать новые аспекты, если они будут основаны. :)
@dba хорошие моменты. 0 был избыточным, поэтому я удалил его - проверка значений предлагается в примере MSDN (если вы видели ссылку под кодом) - IMO не имеет значения, где вы определяете свою виртуальную машину, если вы можете заставить ее работать (дело вкуса) - Связывание AFAIK с DP намного эффективнее и удобнее, чем INotifyPropChange (который постоянно должен ломать материал xaml для запуска одной строки кода CS)
@dba дополнительный обработчик на самом деле очень хорошо работает с xaml, поскольку они оба используют одну и ту же инфраструктуру. Однажды я прочитал, что виртуальная машина должна использовать INotifyPropChange, если это не может быть DepObject (например, poco), но DP, настолько похожий на xaml, делает исполняемый файл более отзывчивым. Хотя я не совсем уверен, что именно это означает!
@Bijan присматривал за ссылкой :) В любом случае, я никогда не видел, чтобы Prop проверялась до того, как она установлена. :) Должно быть дело вкуса :). Я использую DP в повторно используемых UserControls только для настраиваемых Props, независимо от их DataContext в Codebehind UC. В ВМ он делает больше линий только на моих глазах. В любом случае может ошибаться. :)
Просто используйте вот так,
public void BtnCompute_Click_1(object sender, RoutedEventArgs e)
{
MyClass ff = new MyClass();
int amount;
int.TryParse(ff.SelectedAmount, out amount);
deposit = amount;
}
@EyadKelleh, Вы получаете какое-нибудь значение от ff.SelectedAmount? см. окно вывода для ошибок привязки.
как вы определили свою собственность? пожалуйста, укажите соответствующий код для
SelectedAmount