好的,简而言之,我的程序有一个客户列表。这些客户都列在列表框中,因此当点击一个客户时,他们的所有信息都会显示在表单上。这通过数据绑定工作,页面上的所有控件都绑定到列表框的selectedItem。
我现在要做的是有一个消息对话框,询问用户在尝试更改选择时是否要保存。如果他们不这样做,我想将其恢复为集合中的原始项目。如果他们点击取消我希望选择重点回到之前选择的项目。我想知道以MVVM方式实现这一目标的最佳方法是什么?
目前我的客户有一个模型,我的虚拟机填充了列表框绑定的客户集合。那么有没有办法处理VM上的选择更改事件,包括能够操作列表框的selectedIndex? 这是我的代码,所以你可以看到我在做什么。
if (value != _selectedAccount)
{
MessageBoxResult mbr = MessageBox.Show("Do you want to save your work?", "Save", MessageBoxButton.YesNoCancel);
if (mbr == MessageBoxResult.Yes)
{
//Code to update corporate
Update_Corporate();
_preSelectedAccount = value;
_selectedAccount = value;
}
if (mbr == MessageBoxResult.No)
{
//Do Stuff
}
if (mbr == MessageBoxResult.Cancel)
{
SelectedAccount = _preSelectedAccount;
NotifyPropertyChanged("SelectedAccount");
}
}
答案 0 :(得分:2)
捕获已更改事件的最佳方法是将列表框的SelectedItem绑定到视图模型中的另一个属性,然后在集合上执行您需要执行的操作:
private Customer selectedCustomer;
public Customer SelectedCustomer
{
get { return selectedCustomer; }
set
{
if (selectedCustomer== value) return;
selectedCustomer = value;
RaisePropertyChanged("SelectedCustomer");
// Do your stuff here
}
}
这是使用MVVM灯(RaisePropertyChanged)的示例。
答案 1 :(得分:1)
XAML:
<ListBox ItemsSource="{Binding Customers}" SelectedItem="{Binding SelectedCustomer}" DisplayMemberPath="CustomerName"/>
视图模型:
private Customer selectedCustomer;
public Customer SelectedCustomer
{
get
{
return selectedCustomer;
}
set
{
if (value != selectedCustomer)
{
var originalValue = selectedCustomer;
selectedCustomer = value;
dlgConfirm dlg = new dlgConfirm();
var result = dlg.ShowDialog();
if (!result.HasValue && result.Value)
{
Application.Current.Dispatcher.BeginInvoke(
new Action(() =>
{
selectedCustomerr = originalValue;
OnPropertyChanged("SelectedCustomer");
}),
System.Windows.Threading.DispatcherPriority.ContextIdle,
null
);
}
else
OnPropertyChanged("SelectedCustomer");
}
}
}
从here获取/进一步信息。