我在我的View中有一个控件的依赖项属性绑定到我的ViewModel上的一个字段。当用户点击菜单项时,我希望控件更新该属性的值,以便ViewModel可以将其保存在XML文件中。让ViewModel请求View更新该属性的正确机制是什么?ViewModel如何在WPF/MVVM中的View中请求更新?
回答
你的对象必须实现INotifyPropertyChanged
接口和你的属性应该是这样的
private string _property;
public string Property
{
get { return _property; }
set
{
if(_property == value) return;
_property = value;
RaisePropertyChanged("Property");
}
}
所以对财产作出的每个改变将级联来查看通过绑定机制。
菜单项命令属性将绑定到在视图模型中声明的命令,它将触发视图模型上的方法并设置属性值。更改将级联到视图:
menuItem.Click - > menuItem.Command.Execute - > viewModel.method - >更改视图模型属性 - >提高属性更改事件 - >通过具有约束力的
视图属性更改
通常,MVVM控件在编辑时会立即更新它们的绑定属性(不是字段)。 ViewModel是“状态”,View只是查看该状态的一种方式。
无论何时编辑,您的控件都应该更新ViewModel。当调用菜单命令时,您的ViewModel可以将其保存为XML。
感谢您的回答。问题是获取视图的数据需要方法调用。除非需要数据,否则通常不会调用此方法。视图更改时,数据不会自动更新。 – Beth 2012-03-29 14:13:26
仍然有点不清楚你想要的确切顺序。它是负责检索数据的ViewModel。如果视图需要触发某个点的数据检索,那么在您的ViewModel中暴露一个Command,并从视图中调用它(OP中的菜单?) – GazTheDestroyer 2012-03-29 14:29:21
ViewModel需要触发View从其自身检索数据。当菜单项被点击并发送回ViewModel时,视图状态需要通过控件本身的方法调用来捕获。 – Beth 2012-03-29 14:54:57
我在写入文本框后在点击菜单项后没有更新视图模型的问题。
随着参数UpdateSourceTrigger =的PropertyChanged,它为文本框:
<TextBox Grid.Column="5" Grid.Row="7" Text="{Binding SelectedPerson.Room, UpdateSourceTrigger=PropertyChanged}"></TextBox>
但不幸的是不是DatePickers ...
奇怪的是,在一个按钮,而不是菜单项,当点击, DatePicker正在更新视图模型。 由于我现在没有更多时间来查找错误修正,我只需将我的菜单项更改为按钮即可。
编辑:问题不是菜单项,而是菜单本身。当我将菜单项移出菜单时,它可以工作。
- 1. 如何更新请求头中的cookie?
- 2. 在ViewModel中更新视图
- 3. 在C#中,如何在ViewModel的View上设置DataContext?
- 4. 更新jquery中的viewmodel
- 5. 如何在Apache HttpClient中更新请求的目标主机?
- 6. 如何在mysql中新创建的VIEW中更改属性?
- 7. 如何在HttpWebRequest中更改请求IP?
- 8. 在Prism.Unity.Forms中取消注册View和ViewModel
- 9. 无法在View中看到ViewModel属性?
- 10. 如何在控制器中更改ViewModel时更新视图
- 11. 如何在MVC 5中的单个Ajax POST请求中发送ViewModel和文件?
- 12. 请求中的AFNetworking更新URL
- 13. 在更新请求更新某些值
- 14. MVVM中的ViewModel应该引用View吗?
- 15. 如何在ViewModel类中创建一个新的ViewModel实例?
- 16. 如何处理ViewModel中的Validation.Error而不是View的代码?
- 17. ConcurrentUpdateSolrClient如何处理更新请求?
- 18. 如何优化MySQL更新请求?
- 19. 如何验证请求更新中的规则? laravel 5
- 20. 如何截获Hibernate中的更新请求
- 21. 如何获取laravel 5.2更新方法中的请求
- 22. 如何更新PHP中每个请求的时间戳?
- 23. Play Framework如何更新请求中的会话
- 24. One View with multi-ViewModel
- 25. Durandal:Multiple Routes,One ViewModel/View
- 26. 如何将View对象发送给WPF MVVM中的ViewModel?
- 27. 如何使用Caliburn.Micro访问ViewModel中的View-Propperties
- 28. 如何将View中的自定义属性绑定到ViewModel上?
- 29. 如何使用DelegateCommand将View中的信息传递给ViewModel?
- 30. 如何为ViewModel和View创建模板?
我认为OP的要求正好相反。 View-> ViewModel,而不是ViewModel->查看 – GazTheDestroyer 2012-03-26 13:56:07
GazTheDestroyer是正确的。 – Beth 2012-03-29 14:14:03
我编辑了我的答案,我添加了描述如何做到这一点。 – 2012-03-30 06:29:55