0

wpfgrid にテキストボックスがあり、tekst の挿入などを実行する必要があります。これを行うために、テキスト ボックスはビューからプレゼンテーション モデルに参照されますReferenceToTextBox(Prism で MVP を実行します)。また、ビュー内のテキスト ボックスは、モデルの -property にTextDescriptionバインドされています。Description

いくつかの事前定義されたテキスト BLOB (住所、VAT 番号など) を含むドロップダウン リストもあります。これらのいずれかを選択すると、テキストボックスのキャレットの現在の位置に挿入されます。CaretIndex にバインドできないため、上記の回避策が作成されます。ドロップダウン リストは SelectedItem でモデルのプロパティにバインドされているため、SelectedItem が変更されるとプロパティが変更され、プロパティのセッターでメソッドが呼び出されて、選択されたアイテムのテキストがReferenceToTextBox「仮想」に挿入されます。モデル内のテキスト ボックス (ビュー内のテキスト ボックスへの単なる参照である必要があります)。

ただし、ビューのテキスト ボックスからすべてのテキストを削除し、新しい定義済みのテキスト ブロブを追加するとします。プロパティには、ReferenceToTextBox.Text削除したすべてのテキストがまだ含まれています。ReferenceToTextBoxはもはや単なる参照ではなく、独自のテキストボックス全体のようです。ReferenceToTextBox.Textビューの「ビジュアル」テキストボックスを実際に更新すると、さらに奇妙になります。

ここで実際に何が起こっているのですか?

4

1 に答える 1

1

あなたの質問に対する直接的な答えではありませんが、実際にそのCaretIndexプロパティへのバインドを許可する派生 TextBox クラスについてはどうですか:

public class TextBoxEx : TextBox
{
    public static readonly DependencyProperty CaretIndexProperty = DependencyProperty.Register(
        "CaretIndex", typeof(int), typeof(TextBoxEx),
        new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, CaretIndexChanged));

    public new int CaretIndex
    {
        get { return (int)GetValue(CaretIndexProperty); }
        set { SetValue(CaretIndexProperty, value); }
    }

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        base.OnTextChanged(e);
        CaretIndex = base.CaretIndex;
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        CaretIndex = base.CaretIndex;
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);
        CaretIndex = base.CaretIndex;
    }

    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        CaretIndex = base.CaretIndex;
    }

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        CaretIndex = base.CaretIndex;
    }

    private static void CaretIndexChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        if (obj is TextBox)
        {
            ((TextBox)obj).CaretIndex = (int)e.NewValue;
        }
    }
}
于 2012-08-03T08:38:13.430 に答える