Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从ViewModel(MVVM)调用UI控件方法?_C#_Silverlight_Mvvm - Fatal编程技术网

C# 如何从ViewModel(MVVM)调用UI控件方法?

C# 如何从ViewModel(MVVM)调用UI控件方法?,c#,silverlight,mvvm,C#,Silverlight,Mvvm,我想从ViewModel调用AutoMepleBox s PopulateComplete() 如何调用它?有几种不同的方法可以实现这一点,这取决于您尝试执行的操作……您尝试从ViewModel中的何处调用PopulateComplete()?例如,如果您在的实例中,则可以将控件作为参数传入,强制转换它并调用您的方法 根据你的评论,我会用一种稍微不同的方式来处理这个问题。由于控制的局限性,它将涉及一些变通方法 向代码隐藏中的视图添加事件侦听器,侦听视图模型中集合的集合更改事件。然后可以在事件处理

我想从ViewModel调用AutoMepleBox s PopulateComplete()
如何调用它?

有几种不同的方法可以实现这一点,这取决于您尝试执行的操作……您尝试从ViewModel中的何处调用PopulateComplete()?例如,如果您在的实例中,则可以将控件作为参数传入,强制转换它并调用您的方法

根据你的评论,我会用一种稍微不同的方式来处理这个问题。由于控制的局限性,它将涉及一些变通方法

向代码隐藏中的视图添加事件侦听器,侦听视图模型中集合的集合更改事件。然后可以在事件处理程序中调用PopulateComplete()。您需要在视图中引用ViewModel,才能使其正常工作


另一个选项是在视图加载时(使用EventTrigger)将对AutoMepleBox的引用传递给ViewModel,并将该引用存储在私有字段中。然后,当web服务调用返回时,使用此引用调用PopulateComplete()。

视图应该处理与用户界面和视图有关的所有事情-理想情况下,您应该从视图本身调用
PopulateComplete()
。根据您对BrandonZeider答案的评论,我建议您在ViewModel上创建一个事件,该事件在服务方法完成时触发,并将您的
PopulateComplete()
调用放入视图中该事件的处理程序中


现在,您可以在任何地方使用ViewModel—如果在服务调用完成时视图上需要发生什么事情,它只需订阅新事件即可。

使用System.Windows.Interactive的行为是一种很好的方法

看看这个--在这种情况下,他使用它作为水印,但你可以很容易地调整行为。。。我经常引用这篇博客文章作为起点


关于行为,最主要的一点是,你可以访问那些你无法访问的东西,那些你在视图模型中无法附加的事件,你需要几分钟才能弄清楚它们,但是有一天晚上,你在沙发上阅读一些博客和MSDN,你将是一个超级粉丝

我有一个服务方法,它加载列表,并将该列表绑定到自动完成框ItemsSource属性。现在在服务方法中,在将每个项目加载到列表后,我想调用AutoCompleteBox的方法,该方法将呈现该列表中的下拉列表+1这个。行为很酷。。。希望他们能像Silverlight一样为WPF开箱即用。这是我在极少数需要VM回调到视图的情况下所采用的方法。只要在VM上公开一个事件,并允许视图在需要时挂接到它。