Значение привязки TextBox int, чтобы использовать его

как получить значение текстового поля и попытаться использовать его как 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

Bizhan 22.07.2018 12:50

публичная строка SelectedAmount {получить {return _selectedAmount; } установить {_selectedAmount = значение; }} частная строка _selectedWeeks;

Eyad Kelleh 22.07.2018 13:19

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

Bizhan 22.07.2018 13:26

Я пробовал ваше решение, но оно не работает

Eyad Kelleh 23.07.2018 10:57

тогда я предлагаю сначала прочитать некоторые основы

Bizhan 23.07.2018 11:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
219
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете без труда привязать 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

Anthony Russell 22.07.2018 13:46

@AnthonyRussell В этом нет необходимости, потому что режим привязки по умолчанию для элементов управления вводом, таких как TextBox, - TwoWay.

Bizhan 22.07.2018 13:48

_selectedAmount не требует инициализации, int по умолчанию имеет значение 0 :). Я не вижу смысла проверять значение поля в установщике свойства ... Свойство не уведомляет, если нет изменений (AFAIK). Не уверен, что установка Datacontext для UserControl через XAML - хорошая идея ... как получить доступ к данным экземпляра? Я также не стал бы определять Props как свойства зависимостей в ViewModel, вам понадобится дополнительный обработчик для каждого Prop в виртуальной машине, чтобы уловить изменение и запустить логику. Но это может быть больше дело вкуса .... Без заборов, я рад узнать новые аспекты, если они будут основаны. :)

dba 22.07.2018 14:50

@dba хорошие моменты. 0 был избыточным, поэтому я удалил его - проверка значений предлагается в примере MSDN (если вы видели ссылку под кодом) - IMO не имеет значения, где вы определяете свою виртуальную машину, если вы можете заставить ее работать (дело вкуса) - Связывание AFAIK с DP намного эффективнее и удобнее, чем INotifyPropChange (который постоянно должен ломать материал xaml для запуска одной строки кода CS)

Bizhan 22.07.2018 14:55

@dba дополнительный обработчик на самом деле очень хорошо работает с xaml, поскольку они оба используют одну и ту же инфраструктуру. Однажды я прочитал, что виртуальная машина должна использовать INotifyPropChange, если это не может быть DepObject (например, poco), но DP, настолько похожий на xaml, делает исполняемый файл более отзывчивым. Хотя я не совсем уверен, что именно это означает!

Bizhan 22.07.2018 15:05

@Bijan присматривал за ссылкой :) В любом случае, я никогда не видел, чтобы Prop проверялась до того, как она установлена. :) Должно быть дело вкуса :). Я использую DP в повторно используемых UserControls только для настраиваемых Props, независимо от их DataContext в Codebehind UC. В ВМ он делает больше линий только на моих глазах. В любом случае может ошибаться. :)

dba 22.07.2018 15:05

Просто используйте вот так,

    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? см. окно вывода для ошибок привязки.

DotNetUser 23.07.2018 13:37

Другие вопросы по теме