关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
7年前关闭。
Improve this question
我什至不知道这是否是正确的标题,但无论如何。我正在从 WinForms 切换并尝试学习 WPF 和 MVVM 方法。
我有一个自定义类,Incident
,用于存储有关我的团队必须响应的事件的数据。我正在构建一个 View 来向用户显示该类实例中的数据,并允许该用户对其进行操作。有几条DateTime
需要显示的数据 - Start
, End
, Notification_Received
, Actions_Taken
.我需要一个小按钮来放置 DateTime.Now
进入每个关联的 TextBox
以及更改当前加载的 Incident
实例的基础值类(class)。
我试图弄清楚如何做到这一点。使用 WinForms,我只需设置 TextBox.Text
和 Incident.Start
(等)到DateTime.Now
都在同一个Button_Click
函数,但我对 MVVM 的理解是我不应该这样做,而是应该绑定(bind) TextBox
到 VM 并更新 VM 的值。
这就是我卡住的地方。我很确定我擅长如何进行绑定(bind),但不是我从 Button_Click
更改 VM 值的部分。功能。请协助?
最佳答案
你是对的 - View 模型应该控制更改,并且文本框应该通过绑定(bind)更新。
在 MVVM 模式中,很少使用代码隐藏。而不是 Button_Click
方法,你需要一个命令绑定(bind):
<Button Command="{Binding SetAllDatesToNowCommand}"/>
该命令将在按下按钮时执行。
SetAllDatesToNowCommand
是一个命令处理程序 - 它应该是 ICommand
您的 View 模型上的属性:public ICommand SetAllDatesToNowCommand { get; private set; }
我一般倾向于使用
RelayCommand
来自 MVVM Light Toolkit创建命令处理程序,因为语法干净且非常简单。命令处理程序在您的 View 模型的构造函数中初始化。传递给 RelayCommand
的处理程序方法是您应该在所选 Incident
上设置属性的位置目的:public YourViewModel()
{
this.SetAllDatesToNowCommand =
new RelayCommand(this.ExecuteSetAllDatesToNowCommand);
}
...
public void ExecuteSetAllDatesToNowCommand()
{
this.selectedIncident.Start = DateTime.Now;
// etc.
}
如果您的文本框上的绑定(bind)设置正确,并且正在设置的属性正在触发适当的
PropertyChanged
事件,它们应该在命令执行方法中设置属性时更新。但是,我建议您应该有一个
Incident
的 View 模型。 ,它实现了 INotifyPropertyChanged
界面。上面概述的命令将是该 View 模型的属性。例如,设置 Start
该 View 模型上的属性应设置 Incident
上的属性object 它是(“模型”对象)的 View 模型,还应该引发 PropertyChanged
事件。否则,您的 Incident
类必须实现 INotifyPropertyChanged
,模型和 View 模型类之间的界限变得不那么清晰了。
关于c# - 使用 Button_Click 事件使用 MVVM 更改文本框内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357140/