2

バインディングを介してトリミングされたテキストを提供する 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));
        }
    }
}
4

1 に答える 1

0

奇妙なことに、値の強制はバインドではうまく機能しません。

このスレッドでは、同じ問題について話し、1 つまたは 2 つの回避策を提案しています。UpdateTarget()それらの 1 つは、TextBox のバインド式を明示的に呼び出すことです。

textBox1.GetBindingExpression(MyTextBox.TextProperty).UpdateTarget();
于 2012-11-19T21:21:02.433 に答える