我正在使用MVVM设计模式在wpf中开发一个应用程序。当一个项目被选中时,我有一个列表框,然后一个对话框打开,在可编辑模式下具有相同的记录。此对话框与列表中的选定项绑定。我已使用IDataErrorInfo应用文本框的验证规则。当用户更新对话框上的记录时,然后在每次按键时,列表框中的所选记录也会更改。如果用户按下保存按钮,则我将更改提交到数据库。但是如果用户单击取消按钮,则我不会向数据库提交更改,但会使用GUI中的当前更新来更新列表框。当我刷新列表时,旧值再次出现。我的要求是仅在用户点击保存按钮时更新列表框,而不是在每个按键对话框上更新。我首先用linq填充通用列表到sql类然后用它绑定列表框。请让我知道我要做什么。
提前致谢
答案 0 :(得分:0)
问题是您正在两个表单上编辑同一个对象。您应该将SelectedItem传递给对话框窗体,然后重新查询数据库以查找传递给构造函数的项。这样做有两件事:允许您在编辑对象时取消更改,并为用户提供数据库中的最新数据。
以这种方式思考......如果列表框包含的数据甚至只有几分钟,那么您的用户将修改可能已由另一个运行您的应用程序的用户更改过的数据。
用户在对话框表单中保存(或删除)记录后,您必须刷新列表框。通常我使用以下方法:
<强> DialogViewModel:强>
// 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);
ListBox ViewModel
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();