0

我的 wpfgrid 上有一个文本框,我需要执行一些 tekst 插入等。为此,从视图中将文本框引用到演示模型中ReferenceToTextBox(我们使用 Prism 进行 MVP)。此外,视图中的文本框TextDescription绑定到Description模型上的 -property。

我们还有一个下拉列表,其中包含一些预定义的文本块(地址、增值税号等)。当您选择其中之一时,它们应插入到插入符号当前位置的文本框中。由于您无法在 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 回答