2012-07-03 4 views
0

У меня есть текстовое поле, содержащее десятичное значение на моем интерфейсе, которое я хочу очистить, когда пользователь его выбирает.WPF Скрыть текст TextBox в фокусе

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

До сих пор у меня есть следующий стиль:

<Style x:Key="CustomTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"/> 
     <Style.Triggers> 
      <Trigger Property="IsFocused" Value="True"> 
       <Setter Property="Text" Value="{x:Null}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

, а затем следующий использовать стиль:

<TextBox Style="{DynamicResource CustomTextBoxStyle}" 
        Tag="{Binding myDecimalValue, StringFormat=#.###}" 
        TabIndex="1" /> 

Однако, в этом случае значение возвращается к тому, что это было даже когда пользователь вводит новое значение.

Может ли кто-нибудь сказать мне лучший способ добиться этого?

Спасибо,

+0

Проверить этот ответ - http://stackoverflow.com/a/695751/182344 Похоже, что это то, что вам нужно – RredCat

ответ

0

Спасибо за помощь, но я был в состоянии добиться того, что я искал и придерживаться MVVM принципов с помощью AttachedProperty, описанной в следующем:

https://stackoverflow.com/a/7972361/1466960

Это позволило мне связать IsFocused свойство для значения в моей модели представления и действовать аналогично тому, как описано Райаном Эймисом.

вид Модель:

bool isFocused = false; 
double original; 

public bool IsFocused 
{ 
    get 
    { 
     return isFocused; 
    } 
    set 
    { 
     isFocused = value; 

     if (isFocused) 
     { 
      original = current; 
      current = ""; 
     } 
     else 
     { 
      if (HundredPercentLine == "") 
       current = original; 
     } 

     OnPropertyChanged(new PropertyChangedEventArgs("IsFocused")); 
    } 
} 
0

Решение здесь не скрыть текст, но и сохранить его в переменной для последующего использования. В C# код будет что-то вроде:

string _originalValue; 

public OnFocus(){ 
    _originalValue = TextBox.Text; 
    TextBox.Text = ""; 
} 
public LostFocus(){ 
    if(TextBox.Text == "") 
     TextBox.Text = _originalValue; 
} 
+0

у меня есть значение текстового поля связано значение в моей модели ViewModel. Как связать значение с другой переменной в зависимости от того, имеет ли фокус TextBox? – RagtimeWilly

+0

@RagtimeWilly - вы не изменили привязку, вы измените значение связанного свойства. Это потребует, чтобы ваша виртуальная машина выполняла метод, основанный на событиях из представления. Также технически возможно, но нарушение принципов MVVM, для доступа к виртуальной машине непосредственно из обработчика события в коде. –

0

Вы можете установить forground цвет прозрачным, чтобы скрыть текст, если это необходимо.

Если вы действительно хотите удалить текст, вы должны сделать то, что предлагает Райан Эймис на viewmodel, который вы сможете получить через datacontext.

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