2012-03-26 63 views
1

我在我的View中有一个控件的依赖项属性绑定到我的ViewModel上的一个字段。当用户点击菜单项时,我希望控件更新该属性的值,以便ViewModel可以将其保存在XML文件中。让ViewModel请求View更新该属性的正确机制是什么?ViewModel如何在WPF/MVVM中的View中请求更新?

回答

0

你的对象必须实现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 - >更改视图模型属性 - >提高属性更改事件 - >通过具有约束力的

视图属性更改
+1

我认为OP的要求正好相反。 View-> ViewModel,而不是ViewModel->查看 – GazTheDestroyer 2012-03-26 13:56:07

+0

GazTheDestroyer是正确的。 – Beth 2012-03-29 14:14:03

+0

我编辑了我的答案,我添加了描述如何做到这一点。 – 2012-03-30 06:29:55

1

通常,MVVM控件在编辑时会立即更新它们的绑定属性(不是字段)。 ViewModel是“状态”,View只是查看该状态的一种方式。

无论何时编辑,您的控件都应该更新ViewModel。当调用菜单命令时,您的ViewModel可以将其保存为XML。

+0

感谢您的回答。问题是获取视图的数据需要方法调用。除非需要数据,否则通常不会调用此方法。视图更改时,数据不会自动更新。 – Beth 2012-03-29 14:13:26

+0

仍然有点不清楚你想要的确切顺序。它是负责检索数据的ViewModel。如果视图需要触发某个点的数据检索,那么在您的ViewModel中暴露一个Command,并从视图中调用它(OP中的菜单?) – GazTheDestroyer 2012-03-29 14:29:21

+0

ViewModel需要触发View从其自身检索数据。当菜单项被点击并发送回ViewModel时,视图状态需要通过控件本身的方法调用来捕获。 – Beth 2012-03-29 14:54:57

0

我在写入文本框后在点击菜单项后没有更新视图模型的问题。

随着参数UpdateSourceTrigger =的PropertyChanged,它为文本框:

<TextBox Grid.Column="5" Grid.Row="7" Text="{Binding SelectedPerson.Room, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

但不幸的是不是DatePickers ...

奇怪的是,在一个按钮,而不是菜单项,当点击, DatePicker正在更新视图模型。 由于我现在没有更多时间来查找错误修正,我只需将我的菜单项更改为按钮即可。


编辑:问题不是菜单项,而是菜单本身。当我将菜单项移出菜单时,它可以工作。

相关问题