11

人がテキストボックスに入力すると、特定の文字をテキストボックスに置き換える方法を探しています。バインディングやビューモデルなどではなく、コントロール自体に注目していることに注意してください。データなし、ビューモデルなし、バインディングなしなど。

以下のすべての回答がバインディング、依存関係プロパティ、強制などに焦点を合わせ続けているように見えるため、質問を更新しました。提案に感謝しますが、上で述べたように、私たちのコントロールはバインドされたコントロールではないため、適用できません。

その理由を説明することはできますが、実際には複雑で高度なユースケースであるため、この投稿は約 5 倍長くなりますが、それは質問自体とは何の関係もないため、シナリオを単純化しました。解決しようとしている特定の質問に焦点を当てます。これは、テキスト ボックス コントロール、または入力時に文字を置き換えるもののサブクラスに関するものです。

それが今より理にかなっていることを願っています。

4

4 に答える 4

2

TextBox Text プロパティのメタデータをオーバーライドするだけで、TextBox をサブクラス化できます。

public class FilteredTextBox : TextBox
{
    public FilteredTextBox()
    {
        TextBox.TextProperty.OverrideMetadata(typeof(FilteredTextBox), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, CoerceMyTextValue, true, UpdateSourceTrigger.PropertyChanged));
    }

    private static object CoerceMyTextValue(DependencyObject d, object baseValue)
    {
        if (baseValue != null)
        {
            var userEnteredString = baseValue.ToString();
            return userEnteredString.Replace(' ', '_');
        }
        return baseValue;
    }
}

また、バインディングをまったく使用する必要はありません。入力すると、内部の TextBox TextProperty が更新されるだけです。

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="428" Width="738" Name="UI" 
        xmlns:my="clr-namespace:WpfApplication13" >
    <StackPanel>
        <my:FilteredTextBox />
    </StackPanel>

</Window>
于 2013-09-24T01:10:08.307 に答える