0

我的界面上有一个包含十进制值的文本框,只要用户选择它,我就想清除它。

但是,如果用户不进行任何更改并选择另一个界面元素,我需要将文本恢复为清除之前的任何内容。

到目前为止,我有以下风格:

<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" />

但是,在这种情况下,即使用户输入了新值,该值也会恢复为原来的值。

谁能告诉我实现这一目标的最佳方法?

谢谢,

4

3 回答 3

0

这里的解决方案不是隐藏文本,而是将其存储在变量中以备后用。在 C# 中,代码类似于:

string _originalValue;

public OnFocus(){
    _originalValue = TextBox.Text;
    TextBox.Text = "";
}
public LostFocus(){
    if(TextBox.Text == "")
        TextBox.Text = _originalValue;
}
于 2012-07-03T15:23:31.397 回答
0

如果合适,您可以将前景色设置为透明以隐藏文本。

如果您真的想删除文本,您应该按照 Ryan Amies 在视图模型上的建议执行操作,您应该能够通过 datacontext 获得。

于 2012-07-03T15:34:00.343 回答
0

感谢您的帮助,但我能够通过使用以下描述的 AttachedProperty 来实现我想要的并遵守 MVVM 原则:

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

这允许我将 IsFocused 属性绑定到我的视图模型中的一个值,并以与 Ryan Amies 描述的方式类似的方式进行。

查看型号:

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"));
    }
}
于 2012-07-04T08:20:04.763 回答