WPF文本框文本强制转换

3

我需要实现一个 WPF TextBox,通过绑定提供修剪后的文本。

乍一看,这项任务对我来说似乎相当简单。我决定使用依赖属性值强制。下面是我的代码,但是它似乎不起作用。我在我的绑定属性中得到的字符串并没有被修剪。我做错了什么?也许我应该采取另一种方法?

public class MyTextBox : TextBox
{
    static MyTextBox()
    {
        TextProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(string.Empty, null, new CoerceValueCallback(CoerceText)));
    }

    private static object CoerceText(DependencyObject d, object basevalue)
    {
        string s = basevalue as string;
        if(s != null)
        {
            return s.Trim();
        }
        else
        {
            return string.Empty;
        }
    }
}

我为了测试在我的应用程序中添加了一个简单的窗口。

Xaml:

<Window x:Class="TextBoxDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:TextBoxDemo="clr-namespace:TextBoxDemo"
    Title="MainWindow"
    Width="525"
    Height="350">
<Grid>
    <TextBoxDemo:MyTextBox x:Name="textBox1"
                           Width="120"
                           Height="23"
                           Margin="55,73,0,0"
                           HorizontalAlignment="Left"
                           VerticalAlignment="Top"
                           Text="{Binding Text}" />
    <TextBoxDemo:MyTextBox x:Name="textBox2"
                           Width="120"
                           Height="23"
                           Margin="286,184,0,0"
                           HorizontalAlignment="Left"
                           VerticalAlignment="Top"
                           Text="{Binding Text}" />
</Grid>
</Window>

代码后台:

public partial class MainWindow : Window
{
    private string _text;

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public string Text
    {
        get { return _text; }
        set
        {
            _text = value;
            MessageBox.Show(string.Format("|{0}|", _text));
        }
    }
}

这对我来说看起来不错。MyTextBox 的 Text 属性值永远不会包含开始或结束的空格。你到底想要实现什么? - undefined
我添加了测试应用程序的代码。消息框显示的文本未经修剪。 - undefined
1个回答

0

奇怪的是,值强制转换与绑定不太兼容。

这个帖子讨论了同样的问题,并提出了一两种解决方法。 其中之一是在TextBox的绑定表达式上显式调用UpdateTarget()

textBox1.GetBindingExpression(MyTextBox.TextProperty).UpdateTarget();

1
好的,这似乎是一个解决方案,但什么时候调用UpdateTarget?我的TextBox不应该需要程序员进行任何其他操作,只需在XAML中声明绑定即可。 - undefined
在您的CoerceText()函数中,在设置完编辑后的值之后,立即调用UpdateTarget()。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接