2013-06-03 6 views
0

Мы используем шаблон MVVM в нашем приложении, у нас был экран с 10 текстовыми полями, когда они вводили значение в любом текстовом поле, другие должны быть отключены. Всякий раз, когда я ввожу значение, событие срабатывает, и я могу отключить другие 9 текстовых полей.Отключение текстовых полей, зависящих от значений текстовых полей, используя MVVM?

здесь возникает проблема, событие не уволят, когда я удалить/Backspace значение

Пример:
Скажем у меня есть 3 Текстовые поля ТВ1, ТВ2, ТВ3 для каждого из них Текстовые поля Связывание текстового свойства подобно тексту = «{Связывание TextBox1, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}« Для TB1, ... аналогично другим текстовым блокамTB2 и TB3.Так теперь, когда я пишу что-то в UI в TB1 Событие Set - это огонь d для TextBox1 Свойство, и я отключу TB2 и TB3. Теперь, когда i Delete/Backspace Single Number/Char в TB1 Событие настройки не запускается для включения других 2 текстовых полей, поскольку нет значения в TextBox TB1.

View : 

<StackPanel orintation = "Horizontal" Margin = "20,0,20,0"> 
<TextBox Text = {Binding TextBox1,Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} IsEnbaled={Binding IsTextBox1Enabled}> 
<TextBox Text = {Binding TextBox2,Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} IsEnbaled={Binding IsTextBox2Enabled}> 
<TextBox Text = {Binding TextBox3,Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} IsEnbaled={Binding IsTextBox3Enabled}> 
</StackPanel> 

ViewModel: 

private bool _isTextBox1Enabled = true; 
private bool _isTextBox2Enabled = true; 
private bool _isTextBox3Enabled = true; 

/// Encapsulating Above 3 _isTextBoxEnabled Properties 

private string _textBox1; 
private String _textBox2; 
private string _textbox3; 

Public String TextBox1 
{ 
    get { Return _textBox1;} 
    set 
    { 
     _textBox1 = value; 
     if (TextBox1 > 0) 
     { 
      _isTextBox2Enabled = false; 
      _isTextBox3Enabled = false; 
     } 
     else 
     { 
      _isTextBox2Enabled = true; 
      _isTextBox3Enabled = true; 
     }   
     NotifyPropertyChanged("TextBox1"); 
    } 
} 

Public String TextBox2 
{ 
    get { Return _textBox2;} 
    set 
    { 
     _textBox2 = value; 
     if (TextBox2 > 0) 
     { 
      _isTextBox1Enabled = false; 
      _isTextBox3Enabled = false; 
     } 
     else 
     { 
      _isTextBox1Enabled = true; 
      _isTextBox3Enabled = true; 
     }   
     NotifyPropertyChanged("TextBox2"); 
    } 
} 

Public String TextBox3 
{ 
    get { Return _textBox3;} 
    set 
    { 
     _textBox3 = value; 
     if (TextBox3 > 0) 
     { 
      _isTextBox2Enabled = false; 
      _isTextBox1Enabled = false; 
     } 
     else 
     { 
      _isTextBox2Enabled = true; 
      _isTextBox1Enabled = true; 
     }  
     NotifyPropertyChanged("TextBox3"); 
    } 
} 
+0

LostFocus кажется лучшим подходом, но я сомневаюсь в этом дизайне, потому что вы отключите пользователя от табуляции до/фокусировки следующего текстового поля. –

+0

Lost Focus будет работать, но требование похоже на то, как и когда пользователь вводит другие текстовые поля, необходимо отключить/Включить на основе того, существует ли значение или пусто. – Ujjwal27

+0

Не могли бы вы описать, как это должно работать? Мне непонятно, когда именно текстовые файлы должны быть включены/отключены. Возможно, привязка между свойством Enabled каждого текстового поля и свойствами ViewModel может сделать трюк. –

ответ

1

Чтобы включить обновленную информацию о любом изменении текста значения (без потери фокуса) добавить флаг UpdateSourceTrigger к связыванию.

<TextBox Text="{Binding MyTextProperty, UpdateSourceTrigger=PropertyChanged}" /> 
+0

, но проблема в событии «Изменено свойство» - это Setter для MyTextProperty, который не запускается, когда я удаляю все значения и пустым текстовым полем, чтобы включить другие текстовые поля. – Ujjwal27

+0

покажите свой код настройки viewmodel для текстовых полей. – blindmeis

+0

См. Мою модель образца. – Ujjwal27

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