【发布时间】:2018-12-16 14:58:48
【问题描述】:
在尝试对 WPF 采用更通用的方法(类似于 MVVM 的方式)之后,我遇到了一个问题。
假设我有具有三个字符串属性的经典 Person 类 - FirstName、LastName、Fullname。前两个是用户通过两个TextBoxes输入的,FullName是只读的,打印在TextBlock中。
我有一个带有两个文本框的堆栈面板。我将 Person 实例绑定到 stackpanel 的 DataContext。它看起来像这样:
<StackPanel x:Name="InputData" DataContext="{Binding Person}">
<Text="{Binding FirstName, Mode=TwoWay}"/>
<Text="{Binding LastName, Mode=TwoWay}"/>
</StackPanel>
<TextBlock Text="{Binding FullName}"/>
在 c# 中:
public MainWindow()
{
InitializeComponent();
Person PP= new Person ();
InputData.DataContext = PP;
}
public class Person : INotifyPropertyChanged
{
string _firstName = "Bob";
string _lastName = "Smith";
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
OnPropertyChanged("FullName");
}
}
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
OnPropertyChanged("FullName");
}
}
public string FullName
{
get { return string.Format("{0} {1}", FirstName, LastName); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
现在我想避免意外更改 pp。以前我使用事件和 MessageBoxes 进行管理 - 在 StackPanel 失去焦点或用户按下 Enter 后出现一个消息框并询问是否更改 pp。
如果用户选择“否”,那么一切都会恢复到编辑前的原始状态。
否则 pp 和所有文本框都会保存新值。
现在在尝试绑定和 MVVM 之后,我真的不想回到所有这些事件,那么正确的方法是什么?
【问题讨论】:
-
这个问题可能会被标记,因为它太宽泛而且很大程度上是主观的。简单的答案是“Windows 对话框非常老派,不要在 MVVM 应用程序中使用它们”。如果您决定无论如何,那么有多种方法可以这样做,每种方法都有自己的优点和缺点。如果您想要一个核心 MVVM 纯粹主义方法,请查看the article I wrote on this topic 以及我的示例代码。