0

私の VS 2012 WPF プロジェクトには、機能TextBoxDXを追加するというカスタマイズされたテキスト ボックス クラスがありAutoSelectます。問題ない。TextBoxDX整数のみを許可する IntBox と呼ばれる別のクラスがあります。そこから私たちの物語が始まります。両方のクラスは、次のようなバインド状況で使用されます。

<local:TextBoxDX Grid.Row="0" Grid.Column="1" x:Name="txtBox_singlesName" Width="320" HorizontalAlignment="left" Text="{Binding SelectedItem.name, ElementName=listBoxSingles, Mode=OneWay}"/>
<local:IntBox x:Name="intBox_heightin" Width="60" AllowZeroValue="True" MaxLength="2" Text="{Binding SelectedItem.heightin, ElementName=listBoxSingles, Mode=OneWay}" MinVal="0" MaxVal="11"/>

バインディングを除いて、そのほとんどは無関係であることは確かです。ListBoxどちらも、選択に応じてテキストを変更するという点でうまく機能します。しかし、IntBoxクラスでは、整数のみを許可するコードを追加する必要がありました。そのために、クラスのTextChangedイベントに参加しました。IntBox最終結果は次のとおりです。

using System;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

 namespace Herculese
{
public class IntBox : TextBoxDX
{
    //INIT PROPERTIES
    private int _MaxVal = 0;
    private int _MinVal = 0;
    private bool _AllowZeroValue = false;

    //INIT STRING TO KEEP TRACK OF TEXT BEFORE CHANGES
    private string originalText;

    public IntBox()
    {
        //ADD TO TEXTCHANGED HANDLER
        TextChanged += new TextChangedEventHandler(My_OnTextChanged);

        //STORE ORIGINAL TEXT
        originalText = this.Text;
    }

    //EVENT HANDLER WHEN TEXT IS CHANGED

    private void My_OnTextChanged(object sender, EventArgs e)
    {
        //IF THERE IS TEXT IN THE BOX,
        MessageBox.Show("yee");
        if (this.Text.Length > 0)
        {
            //REMOVE SPACES AND LEADING ZEROS FROM STRING
            if (!_AllowZeroValue)
                this.Text = this.Text.TrimStart('0');
            this.Text = Regex.Replace(this.Text, @"\s+", "");

            //IF VALUE ISN'T NUMERICAL OR NOTHING IS LEFT AFTER REMOVING ZEROS AND SPACES, CHANGE TEXT BACK TO ORIGINAL
            Regex regex = new Regex("[^0-9]+");
            if (regex.IsMatch(this.Text) || this.Text.Length < 1)
            {
                this.Text = originalText;
                System.Media.SystemSounds.Beep.Play();
            }
            //IF VALUE IS NUMERICAL,
            else
            {
                //MAKE SURE VALUE IS WITHIN ACCEPTED RANGE. IF NOT, CHANGE IT TO HIGHEST/LOWEST AVAILABLE RESPECTIVELY
                int intText;
                intText = Convert.ToInt32(this.Text);
                if (intText > _MaxVal)
                {
                    this.Text = _MaxVal.ToString();
                    System.Media.SystemSounds.Beep.Play();
                }
                else if (intText < _MinVal)
                {
                    this.Text = _MinVal.ToString();
                    System.Media.SystemSounds.Beep.Play();
                }
                //SUCCESS!  UPDATE ORIGINAL TEXT WITH NEW VALID VALUE.
                else originalText = this.Text;
            }
        }
    }

    //PROVIDE GET/SET PROPERTIES
    public int MaxVal
    {
        get { return _MaxVal; }
        set { _MaxVal = value; }
    }
    public int MinVal
    {
        get { return _MinVal; }
        set { _MinVal = value; }
    }
    public bool AllowZeroValue
    {
        get { return _AllowZeroValue; }
        set { _AllowZeroValue = value; }
    }
}
}

ご覧のとおり、私は素晴らしい時間を過ごしましTextChangedIntBox。ワイルドパーティー、あなたはそれに名前を付けます。IntBox突然、バインドが機能しなくなっていることに気付きました。手動でテキストをうまく変更できました。整数のみを受け入れ、魅力的に機能しました。しかし、ListBox選択を変更してもテキストは更新されなくなりました。のコードを削除するMy_OnTextChangedと、バインドが再び機能しました。私のコードが問題を引き起こしていると考えました。それで、今日、新鮮な頭で戻ってきて、奇妙なことに気づきました。

のコードを削除してMy_OnTextChangedに置き換えるとMessageBox、バインドが機能し、メッセージ ボックスが表示されます。完全に理にかなっていて、私のコードが問題を引き起こしているという考えを助長します。奇妙なことに、コードの後にMessageBox​​コードをイベントに戻すと、バインディングが再び壊れ、MessageBox決してイベントが発生しないことを意味します。私が言えることは、それは... えっ!? 私が狂っていないことを確認するために、これを数回作り直しました。他に考えられる唯一のことは、継承元との競合であるTextBoxDXため、直接継承させTextBoxて同じ結果を得ました...誰かがこれについて手がかりを得ましたか?

4

1 に答える 1

3

Text元のバインディングを新しい文字列に置き換えたため、新しい値を割り当てています。

使用する代わりに使用してthis.Text = "Somthing"みてくださいbase.SetCurrentValue(TextProperty, value);

例:

//IF VALUE ISN'T NUMERICAL OR NOTHING IS LEFT AFTER REMOVING ZEROS AND SPACES, CHANGE TEXT BACK TO ORIGINAL
Regex regex = new Regex("[^0-9]+");
if (regex.IsMatch(this.Text) || this.Text.Length < 1)
{
    // this.Text = originalText;

    base.SetCurrentValue(TextProperty, originalText);
    System.Media.SystemSounds.Beep.Play();
}

SetCurrentValue値のソースを変更せずに、依存関係プロパティの値を設定します。

于 2013-02-17T21:52:29.863 に答える