2013-09-01 4 views
1

У меня есть два текстовых поля поиска: Above и Below, что я должен установить с ограничениями. Число в Below не может быть больше числа в Above, а число в Above не может быть ниже, чем в Below.Одно из двух текстовых полей не обновляется привязкой

Если одно число неверно, оно должно быть установлено равным другому числу.

Проблема в том, что Above не обновляется, в то время как Bottom (хотя свойства заданы одинаково).

XAML:

<common:SearchTextBox Grid.Column="1" 
    VerticalAlignment="Center" 
    Label="Enter value in feet" 
    common:AllowableTextInput.IsIgnoreWhiteSpace="True" 
    common:AllowableTextInput.IsMatch="^[0-9]{0,5}$" 
    Text="{Binding Path=AboveAircraft, UpdateSourceTrigger=PropertyChanged, 
     Converter={StaticResource AboveAircraftConveter}, ConverterParameter=4000}"/> 
<Label Grid.Row="1" Grid.Column="0" 
    Style="{StaticResource FormLabelStyle}" 
    Content="Below Aircraft (ft):"/> 
<common:SearchTextBox Grid.Row="1" Grid.Column="1" 
    VerticalAlignment="Center" HorizontalAlignment="Stretch" 
    common:AllowableTextInput.IsIgnoreWhiteSpace="True" 
    common:AllowableTextInput.IsMatch="^[0-9]{0,5}$" 
    Text="{Binding Path=BelowAircraft, UpdateSourceTrigger=PropertyChanged, 
     Converter={StaticResource BelowAircraftConveter}, ConverterParameter=2000}" 
    Label="Enter value in feet" /> 

C#:

public int AboveAircraft 
{ 
    get { return _above; } 
    set 
    { 
     if (SetProperty(ref _above, value, "AboveAircraft") && _updateModel) 
     { 
      if (Model.AltitudeBand == null) 
      { 
       Model.AltitudeBand = new AltitudeBand(); 
      } 

      if (PropertyChanged != null) 
      { 

       PropertyChanged(this, new PropertyChangedEventArgs("AboveAircraft")); 
       if (_above < _below) 
       { 
        _below = AboveAircraft; 
       } 
      } 

      Model.AltitudeBand.Above = new AltitudeBandLimit() { Unit = AltitudeUnit.Foot, Value = _above }; 
     } 
    } 
} 

/// <summary> 
/// Below the route of flight in ft 
/// </summary> 
public int BelowAircraft 
{ 
    get { return _below; } 
    set 
    { 
     if (SetProperty(ref _below, value, "BelowAircraft") && _updateModel) 
     { 
      if (Model.AltitudeBand == null) 
      { 
       Model.AltitudeBand = new AltitudeBand(); 
      } 

      if (PropertyChanged != null) 
      { 
       _below = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("BelowAircraft")); 
       if (_below > _above) 
       { 
        AboveAircraft = _below; 
       } 
      } 
      Model.AltitudeBand.Below = new AltitudeBandLimit() { Unit = AltitudeUnit.Foot, Value = _below }; 
     } 
    } 
} 
+0

Какие значения вы испытываете? Что делают 'AboveAircraftConveter' и' BelowAircraftConveter'? Какое влияние оказывают значения «ConverterParameter»? –

+0

Здесь находятся преобразователи: –

+0

AboveAircraftConveter и BelowAircraftConveter конвертировать int в строку. На вкладке «Конвертор» устанавливается значение по умолчанию на экране. Я тестировал различное значение от 1000 до 9000. –

ответ

3

Вы используете _below = AboveAircraft; в методе AboveAircraft сеттер но являются обязательными BelowAircraft.

Либо измените _below = AboveAircraft; на BelowAircraft = AboveAircraft; или отправить уведомление о BelowAircraft тоже, т.е.

  if (PropertyChanged != null) 
      { 

       PropertyChanged(this, new PropertyChangedEventArgs("AboveAircraft")); 
       if (_above < _below) 
       { 
        _below = AboveAircraft; 
        PropertyChanged(this, new PropertyChangedEventArgs("BelowAircraft")); 
       } 
      } 

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

Конечно, вы должны применить те же самые изменения к setter BelowAircraft.

Edit: Просто для уточнения: Какой один из обоих методов зависит, если установка свойства приведет к круговым событие, инициирующее или нет. Если это вызовет круговое событие (т. Е. Бесконечное срабатывание), тогда вам нужно будет отправить второе уведомление, например, код выше.

Edit 2: В ответ на комментарий, ваш XAML Binding установлен в UpdateSourceTrigger=PropertyChanged. Это означает, что ваш setter будет вызываться с каждым введенным вами символом.

Когда вы вводите «4000», первый символ в поле «Выше» будет 4, и это приведет к тому, что значение ниже 4. Вместо этого вы хотите обновите поле «Текст» только в том случае, если пользователь выполнил ввод.

В соответствии с документацией MSDN для «UpdateSourceTrigger Enumeration» имеется 4 значения. Для текстового поля вы можете использовать UpdateSourceTrigger=Default или UpdateSourceTrigger=LostFocus. Тогда сеттер будет вызываться только тогда, когда пользователь закончит свой ввод, вместо того, чтобы вызывать сеттер для каждого символа, введенного в текстовое поле.

+0

Ниже все еще работает, но всякий раз, когда вводится число выше, оно устанавливает первую цифру в поле «Ниже». Например, значение по умолчанию выше 4000, а ниже - 2000. Если я изменю приведенное выше число до 1000, то нижнее число изменится на 1. Мы хотим, чтобы он изменился на 1000, чтобы соответствовать указанному выше числу. –

+0

Событие было уволено за вышеуказанный номер сразу после ввода первой цифры. Затем он отправил цифру на номер ниже. –

+0

Возможно, вам следует обновить свой вопрос. Проблема в вопросе не совпадает с тем, что вы публикуете в комментарии. Также в соответствии с вашей прокомментированной проблемой я кратко обновляю свой ответ – Tseng

Смежные вопросы