【问题标题】:Get textbox functions from View to ViewModel in WPF MVVM在 WPF MVVM 中从 View 到 ViewModel 获取文本框函数
【发布时间】:2018-04-13 07:35:11
【问题描述】:

我是 MVVM WPF 的新手。谁能告诉我是否可以在我的 ViewModel 中使用 View 中的一些文本框函数,例如 textBox.GetLastVisibleLineIndex(),如果可以,如何使用?

谢谢。

编辑

好的,我会完整解释我的问题。我正在为超过 GB 的大文件制作某种文本编辑器,如记事本,我正在为此使用 WPF MVVM 方法。在我读取那个大文件的算法中,我有这个: 我首先阅读了文件的某些部分,然后我需要阅读其他部分,为此我使用一个后台线程来检查用户是否滚动到文本框的中间上方,如果是这种情况,那么线程会从文件中读取更多内容和更新文本框。现在,对于该算法,我需要查看文本框中最后一个可见行是什么,为此我需要使用 textBox.GetLastVisibleLineIndex() 知道该行的索引,但是从我的 ViewModel 中我无法访问该方法.所以,基本上我需要知道如何从 textBox 到我的 ViewModel 获取最后一个可见行。

【问题讨论】:

  • 你说的 如果我可以从 MVVM 获取一些文本框函数 是什么意思?你能举个例子说清楚吗..
  • 正如@RahulAgarwal 已经说过的,采取函数”是什么意思?您的意思是是否应该调用 ViewModel 或Model 中的函数?
  • 是的。在我的 ViewModel 中,我需要从 View 的文本框中查看我最后一个可见的行索引。如果我在视图中从 .cs 类中使用它,我有这个:textBox.GetLastVisibleLineIndex();但我需要在我的 ViewModel 中使用这个功能。
  • 这只是对视图有意义的东西。在视图中使用该代码。添加一个依赖属性以通过绑定将整数传递给您的视图模型。在视图中设置 dp 的当前值。它将传递给您的虚拟机的绑定属性,您可以在您的虚拟机中使用它。
  • 谢谢@Andy,会试试这个。你有这方面的例子吗?

标签: c# wpf mvvm textbox


【解决方案1】:

从您的一行代码中,不可能说出您的问题的任何上下文。
我想这就是它被否决的原因。
因此,这只是为了给你味道。

将附加的 dp 添加到您的视图中:

public partial class MainWindow : Window    
{
    public static DependencyProperty LineNoProperty =
        DependencyProperty.RegisterAttached("LineNo"
            , typeof(int)
            , typeof(MainWindow)
            , new FrameworkPropertyMetadata(null)
        { BindsTwoWayByDefault = true });
    public static int GetDoc(DependencyObject obj)
    {
        return (int)obj.GetValue(LineNoProperty);
    }
    public static void SetDoc(DependencyObject obj, int value)
    {
        obj.SetValue(LineNoProperty, value);
    }

将它绑定到窗口标签中视图模型的属性。您需要先编译,否则会出现蓝色曲线。

  local:MainWindow.LineNo="{Binding someVMProperty}"

在某处,由于您未解释的某些交互,您将其设置为行号:

this.SetCurrentValue(LineNoProperty, newValue);

然后,该值将通过绑定转移到视图模型中的属性,您可以在那里做任何您想做的事情。

请记住,mvvm 并不总是意味着视图中根本没有代码。视图所做的事情是“视图职责”,只有视图知道文本框,更不用说哪一行是其中的最后一行了。

如果滚动是驱动这一点的原因,那么我会直接向视图添加一个事件处理程序,或者如果它需要可重用,则将其封装在一个行为中。
文本框中的滚动发生是因为它里面有一个滚动查看器。
您可以在文本框级别处理冒泡事件。
https://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.scrollchanged.aspx
那可能就是您放置代码以查找最后一行并设置依赖项属性的位置。

如果视图模型需要在行号更改时执行某些操作,您可以从视图模型属性的设置器中调用一个方法。

【讨论】:

  • 感谢@Andy 的回答,我刚刚更新了我的问题,详细解释了我在做什么。
  • 我在帖子中添加了一些内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多