1

私はこれを持っています:

<TextBox x:Name="txbPhone" Text="+420" 
         InputScope="TelephoneNumber" Margin="9,0,9,0"/>

今、私はユーザーに自分の電話番号を次のように書いてもらいたい: ユーザーが TextBox の値を変更するときにコードに手動でスペースを追加して作成することを考えている+420123456789ように、TextBox に表示したい。+420 123 456 789次に、それを使用すると、文字列内のすべてのスペースを削除します。しかし、それは少し「汚い」解決策だと思います。これにテンプレートを設定する方法はありますか? ありがとう

編集:Frederik Winstrup Johansenコメント に記載されているように、コンバーターを作成します。だから私は自分のクラスを作成しました(ConvertBackメソッドにコードを追加する必要があります):

public class PhoneNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var str = (string)value;
        string result;
        if (str[0] == '+')
            result = String.Format("{0:+### ### ### ###}", System.Convert.ToInt64(value));
        else
            result = String.Format("{0:### ### ### ###}", (Int64)value);
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
}

TextBox を次のように変更しました。

<TextBox x:Name="txbPhone" Text="{Binding Path=Phone, Converter={StaticResource phoneNumberConverter}, Mode=TwoWay}" 
                 InputScope="TelephoneNumber" Margin="9,0,9,0" TextChanged="txbPhone_TextChanged"/>

これは私のバインディングです:

        viewModel = new PhonePageViewModel();
        viewModel.Phone = "+420123456";
        this.DataContext = viewModel;

コンバーターは機能していますが、数値を追加してもテキストが変更されません。Convert メソッドの呼び出しはもうありません。これどうやってするの?TextBox 呼び出し Converter で文字を変更するたびに?

私のビューモデルクラス:

namespace SpeedCarsWP.ViewModels
{
    public class PhonePageViewModel : INotifyPropertyChanged
    {
        private string phone;
        public event PropertyChangedEventHandler PropertyChanged;

        public string Phone
        {
            get { return phone; }
            set
            {
                phone = value;
                OnPropertyChanged("Phone");
            }
        }

        public PhonePageViewModel()
        {
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }


    }
}
4

2 に答える 2

1

データバインディング + コンバーターを使用するソリューションを使用する場合は、これを実装するとうまくいきます。(私はそれを試してみましたが、うまくいきました。)

最初に、ビューで XAML-Part:

    <TextBox Height="23" HorizontalAlignment="Left" Margin="78,60,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" 
             Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}" 
             TextChanged="textBox1_TextChanged" />

UpdateSourceTriggerは、テキストを文字ごとにフォーマットすることを表します。

次に、ViewModel-Part:

VM の MyProperty では、NotifyPropertyChangedを使用して更新をトリガーする必要があります。(これを行わないと、コンバーターの Convert-Method は最初の 1 回だけ実行されます。)

第三に、コンバーター部分:

次のようなコンバータ本体を実装できます。

        if (value != null)
        {
            string str = value.ToString();
            string result = str;

            if (str.Length == 1)
            {
                result = str.Insert(0, "+");
            }
            if (str.Length == 5 || (str.Length > 5 && (str.Length -1) % 4 == 0))
            {
                result = str.Insert(str.Length-1, " ");
            }

            return result;
        }
        return value;

これを行うと、テキスト ボックス カーソルがテキストの最後になくなるため、View のコード ビハインドから修正する必要があります。

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        textBox1.Select(textBox1.Text.Length, 0);
    }

これは、Converter を使用したソリューションを考えた迅速な実装にすぎませんが、お役に立てば幸いです。

于 2013-02-05T15:09:00.633 に答える
0

コンバーターは機能していますが、数値を追加してもテキストが変更されません。Convert メソッドの呼び出しはもうありません。これどうやってするの?TextBox 呼び出し Converter で文字を変更するたびに?

コンバーターは自動的に更新されます。

PhonePageViewModel実装してよろしいですINotifyPropertyChangedか? セッターでイベントを発生さ
せますか?PropertyChangedPhonePageViewModel.Phone

バインディングエラーはありますか? (デバッグ時に Visual Studio の [出力] ペインを確認してください)。

于 2013-02-05T14:14:31.447 に答える