Как выполнить обновление свойств и управления в wpf? - PullRequest
0 голосов
/ 03 октября 2011

У меня есть приложение wpf с 3 текстовыми полями.

txb1 для вставки текста

txb2 отображает определенное значение из вставленного проанализированного текста, это целое число

txb3 должно отображать значение из txb2, умноженное на постоянное значение

Существует класс для хранения данных.

class Data
{
    private conts int Mul = 10;
    public string Text {get; set;}
    public int Number {get; set;}
    private int MultiNumber
    {
        get
        {
            Number * Mul;
        }
    }

    public string MultiNumberFormated
    {
        get
        {
            string.Format("{some format}", MultiNumber);
        }
    }
}

Нажав кнопку в форме, я обрабатываю событие, создаю новый экземпляр Data, передаем txb1.Text через конструктор и вызываем функцию синтаксического анализа внутри класса Data, который устанавливает значение в Number. Текстовые поля определяются с помощью Text="{Binding SomeProperty}" и DataContext контейнера с текстовыми полями устанавливается на Data экземпляр, поэтому после нажатия кнопки значения появляются в соответствующих полях.

Теперь Мне нужно решение, чтобы txb3 обновить , когда значение в txb2 равно изменено .

Это небольшой пример сложного приложения с более связанными текстовыми полями. Например, txb4 отображает умноженное MultiNumber, поэтому я не хочу, чтобы решение winforms использовало событие кнопки для обновления. Есть ли такой способ? Я также был бы признателен за пример кода для этого конкретного приложения.

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Как сказал Слакс, вам придется реализовать INotifyPropertyChanged в вашей ViewModel.
Мы имеем в виду паттерн MVVM, в котором особое внимание уделяется V (View) и VM (ViewModel).

Вы можете найти пример здесь

Затем, как только вы задокументируете себя, вы действительно захотите использовать Mode=TwoWay для привязки текстовых полей, которые должны принимать данные от ваших пользователей.

Затем в получателях ваших строковых свойств, которые заполняют другие текстовые поля (те, которые зависят от каждого параметра), вы реализуете логику, которая выполняет вычисления.
В их установщиках вам нужно будет вызвать событие PropertyChanged.

Вы быстро поймете, что WPF тесно связан с этим интерфейсом и шаблоном MVVM.

Теперь, когда вы все это сделаете, я все равно буду там, чтобы ответить на более конкретные вопросы; -)

1 голос
/ 03 октября 2011

У вас есть несколько вариантов здесь.Вам нужно будет реализовать INotifyPropertyChanged в вашем объекте данных, как сказал SLaks - по этому поводу есть множество учебных пособий - тогда вы можете либо

  • Создать новое свойство в вашем классе данных дляумноженное число и привязка txb3 к этому
  • Реализация преобразователя значений для обработки умножения для вас, если он будет отображаться только

Я бы такжеуйдите от вашего текущего подхода к передаче значений из текстового поля в обработчике кнопок.

Я бы, вероятно, посмотрел на перемещение вашей функции MultiNumberFormatted в преобразователь значений для txb2 и привязку данных ко всему (включая txb1, который в данный момент является вашей точкой входа в вычисления и ни к чему не связан?)свойства для экземпляра Data, созданного намного раньше в жизненном цикле - либо созданного со страницей, либо переданного внутрь.

Или вы можете сделать MultiNumberFormatted свойством Data и установить его явно из установщика вашего исходногочисло:

int InputNumber
{
    get
    {
        _return _inputNumber;
    }
    set
    {
        _inputNumber = value;
        MultiNumberFormatted=String.Format("whatever: {0}", InputNumber);   
        NotifyPropertyChanged("InputNumber");
    }
}

string MultiNumberFormatted
{
    get
    {
        return _multiNumber;
    }
    set
    {
        _multiNumber=value;
        NotifyPropertyChanged("MultiNumberFormatted");
    }
}

Это один из способов сделать это, есть другие.Дело в том, что если вы привязываете все к соответствующим свойствам и позволяете инфраструктуре связывания WPF делать свое дело, все это «вживую» и все «просто работает».

1 голос
/ 03 октября 2011

Вам необходимо реализовать INotifyPropertyChanged в вашей модели и вызвать событие PropertyChanged во всех зависимых установщиках свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...