【问题标题】:How to search and replace text in TextBox real time如何实时搜索和替换TextBox中的文本
【发布时间】:2014-03-28 21:21:25
【问题描述】:

我即将为 Windows Phone 开发一个文本编辑应用程序。在这个应用程序中,用户可以输入将自动替换的代码。例如:当用户输入td 时,应用程序会将其替换为today。一旦用户在代码后输入空格,就会发生这种替换。

当我考虑这个应用程序时,我想知道:我将如何以适当的方式实现这一点?我的意思是:坚持 MVVM 模式。

当然,我可以将TextBox 绑定到ViewModel 中的属性,并在每次更改时更新该属性(例如,使用Coding4Fun toolkit 或使用BindingExpression 更新绑定源)。但是在代码被替换后,我该如何正确定位插入符号呢?

或者使用Command 会更好吗?这样我可以命令ViewModel 更改文本,提供当前位置并让Command 回复Message,其中包含新文本和更新的位置。恐怕这会导致View 和ViewModel 之间的流量相当大。

我还在TextBox 上使用EventTrigger 找到了nice solution。但是这个解决方案的一个缺点是替换代码的逻辑由View调用,而它应该由ViewModel调用。

你说什么?

【问题讨论】:

    标签: c# xaml mvvm windows-phone-8


    【解决方案1】:

    您需要添加绑定属性 updateSourceTrigger="PropertyChanged" (Winrt)。它在 wp8 中不存在,所以像这样使用 updateSourceTrigger="Explicit" => UpdateSourceTrigger

    设置位置:"yourTextbox".SelectionStart("yourTextbox".Text.lenght - 1)

    【讨论】:

    • 我知道该怎么做。在我的问题中,我已经提到了你提到的问题。问题是,当我使用此解决方案时,插入符号将位于文本的开头。这不是我想要的,我希望插入符号位于替换代码之后。
    • 仅当我替换的代码位于文本末尾时才有效。当我在其他地方插入代码时,我需要定位插入符号中间文本。
    • 因此您需要知道 selectionStart à text_Changed 的​​开头并设置 selectionStart 和结尾。例如,如果 selectionStart 值在开始时为 2 并且您添加 2 个字符。将 selectionStart 设置为 SelectionStart = selectionStart(您的局部变量) + 2;
    【解决方案2】:

    计算替换的大小,传递,并相应地放置克拉。据我所知,这似乎是最好的解决方案..

    【讨论】:

    • 传递大小是什么意思?谁在传递?视图模型?我应该如何传递它?有消息?还是 ViewModel 上的绑定属性?
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 2015-01-09
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多