WPF中的输入验证

WPF中的输入验证,wpf,input,validation,Wpf,Input,Validation,我正在使用MVVM设计模式在wpf中开发一个应用程序。我有一个列表框,当选中一个项目时,就会打开一个对话框,在可编辑模式下有相同的记录。此对话框与列表中的选定项绑定。我已经使用IDataErrorInfo为textbox应用了验证规则。当用户更新dialogbox上的记录时,每次按键时,listbox中选定的记录也会更改。如果用户按下保存按钮,则我向数据库提交更改。但若用户单击“取消”按钮,则我不会向数据库提交更改,但列表框将使用GUI中的当前更新进行更新。当我刷新列表时,旧值再次出现。我的要求

我正在使用MVVM设计模式在wpf中开发一个应用程序。我有一个列表框,当选中一个项目时,就会打开一个对话框,在可编辑模式下有相同的记录。此对话框与列表中的选定项绑定。我已经使用IDataErrorInfo为textbox应用了验证规则。当用户更新dialogbox上的记录时,每次按键时,listbox中选定的记录也会更改。如果用户按下保存按钮,则我向数据库提交更改。但若用户单击“取消”按钮,则我不会向数据库提交更改,但列表框将使用GUI中的当前更新进行更新。当我刷新列表时,旧值再次出现。我的要求是只在用户点击保存按钮时更新列表框,而不是在每个按键对话框上更新列表框。我首先用linq to sql类填充通用列表,然后用它绑定listbox。请让我知道我要做什么


提前感谢

问题是您在两个表单上编辑的对象相同。您应该将SelectedItem传递给对话框表单,然后重新查询数据库中传递给构造函数的项。这样做有两件事:允许您在编辑对象后取消更改,并向用户提供数据库中的最新数据

这样想吧。。。如果列表框包含的数据甚至只有几分钟的时间,则您的用户将修改运行您的应用程序的其他用户可能已经更改的数据

用户在对话框窗体中保存(或删除)记录后,必须刷新列表框。我通常使用以下方法:

对话框视图模型:

// Constructor
public DialogViewModel(MyObject myObject)
{
    // Query the database for the required object
    MyObject = (from t in _dc.MyObjects where t.ID == myObject.ID 
               select t).Take(1).Single();
}

// First define the Saved Event in the Dialog form's ViewModel:
public event EventHandler Saved;
public event EventHandler RequestClose;

// Raise the Saved handler when the user saves the record
// (This will go in the SaveCommand_Executed() method)
   EventHandler saved = this.Saved;
   if (saved != null)
       saved(this, EventArgs.Empty);
列表框视图模型

Views.DialogView view = new Views.DialogView();
DialogViewModel vm = new DialogViewModel(SelectedItem);  // Pass in the selected item

// Once the Saved event has fired, refresh the 
// list of items (ICollectionView, ObservableCollection, etc.)
// that your ListBox is bound to
vm.Saved += (s, e) => RefreshCommand_Executed();
vm.RequestClose += (s, e) => view.Close();
view.DataContext = vm;
view.ShowDialog();