我正在WPF项目中工作,我正在项目中使用MVVM模式。
我创建了一个用户控件(也在WPF中),我想在我的项目中使用它,现在,我的问题是我的用户控件中有一个方法,我需要从我的View模型调用,但我不知道我不知道如何做到这一点,如何从视图模型中绑定到我控件内的方法。
如果我使用代码,显然没有问题,因为我直接引用了我的控件,所以我可以做“mycontrol.MyMethod();”m,但当然,这样做会违背MVVM模式的逻辑。
我尝试在我的用户控件中使用Dependency属性,并使用该依赖属性在我的项目的xaml中绑定它,但它没有用,编译器说找不到属性或者不可序列化
所以如果有人能分享一些关于如何实现这一目标的信息,我将不胜感激。
被修改
据我所知,你有视图,这是所有的GUI,然后你有模型,这是所有的逻辑,你有视图模型,就像一个用于绑定视图的中间层对模型,对吧?
通过这种方式我开发了我的项目,但是我遇到了一个问题,我需要一个自定义控件,一个记住用户输入内容的TextBox,以及当他开始输入时,如果有以该字母开头的单词,正如谷歌所做的那样,这些词语被显示为一个建议。
此TextBox用作搜索过滤器;所以我创建了一个用户控件来执行此操作,我向我的用户控件添加了一个方法,允许使用我的控件的任何应用程序将项目添加到包含用户输入的所有字符串的内部数组。
我创建了一个用户控件,因为我找不到任何符合我想要的控件。
所以我的问题是当我将我的用户控件添加到主项目时,因为我需要能够调用将项添加到内部数组的方法,但也许我做错了方法,所以如果你们有更好的想法,如果你和我分享,我将不胜感激。
答案 0 :(得分:1)
您永远不应该从ViewModel调用View方法,反之亦然。
在ViewModel上创建一个属性(ObservableCollection?),它将具有CollectionChanged事件,订阅它以监视更改(如果需要)。
当您在ViewModel中向项目集添加项目时,GUI将相应更新(您必须在GUI线程上执行Add()操作,顺便说一句)。
如果您需要更改列表中的当前位置,可以选择(CollectionViewSource等)。
如果您确实需要将字符串传递给控件,请创建DependencyProperty并将其绑定到ViewModel的属性。设置值时,它将在DependencyProperty上调用PropertyChangedCallback。
答案 1 :(得分:0)
您不应该在ViewModel中调用View中的内容,因为这会破坏模型。
如果您想在用户控件中调用该方法的原因仅与UI有关,我从视图中看到它没有任何问题 - 视图的cs和视图的xaml在同一个“空间” “在模型中。想要拥有精简和平均视图cs文件,你可能过于纯粹。
答案 2 :(得分:0)
为什么用户控件的使用者需要维护控件的内部数组?这似乎是您暴露了一个您不需要的实现细节。
为什么不简单地将该数组作为依赖属性(另外还有IEnumerable<string>
或ObservableCollection<string>
)?然后,您只需在视图模型中创建相应的属性并将其绑定到控件。它还使控制功能更加通用。