如何在MVVM-WPF中获取所选项目
嗨我正在使用WPF和MVVM,我的应用程序中有“编辑/更新”面板,它更新了Grid中的选定数据。 它工作正常。 我想添加一个按钮“关闭按钮”和“一个检查以查看用户是否选择了项目。如果他没有选择任何项目并单击”编辑按钮“它将向用户显示一个消息框以选择项目要编辑。我不清楚的是如何通过“选择项目来做这两件事”并在关闭面板之前检查文本框字段中是否有任何文本。用户视图模型代码:
class UserViewModel { private IList _UsersList; public UserViewModel() { _UsersList = new List { new User{UserId = 1,FirstName="Raj",LastName="Beniwal",City="Delhi",State="DEL",Country="INDIA"}, new User{UserId=2,FirstName="Mark",LastName="henry",City="New York", State="NY", Country="USA"}, new User{UserId=3,FirstName="Mahesh",LastName="Chand",City="Philadelphia", State="PHL", Country="USA"}, new User{UserId=4,FirstName="Vikash",LastName="Nanda",City="Noida", State="UP", Country="INDIA"}, new User{UserId=5,FirstName="Harsh",LastName="Kumar",City="Ghaziabad", State="UP", Country="INDIA"}, new User{UserId=6,FirstName="Reetesh",LastName="Tomar",City="Mumbai", State="MP", Country="INDIA"}, new User{UserId=7,FirstName="Deven",LastName="Verma",City="Palwal", State="HP", Country="INDIA"}, new User{UserId=8,FirstName="Ravi",LastName="Taneja",City="Delhi", State="DEL", Country="INDIA"} }; } public IList Users { get { return _UsersList; } set { _UsersList = value; } } private ICommand mUpdater; public ICommand UpdateCommand { get { if (mUpdater == null) mUpdater = new Updater(); return mUpdater; } set { mUpdater = value; } } private class Updater : ICommand { #region ICommand Members public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; public void Execute(object parameter) { } #endregion } } }
用户视图Window.Xaml Panel1
是Panel2:
(如果我的问题不清楚你请问我。谢谢你)
在ViewModel中创建一个属性以保存所选用户:
public User SelectedUser { get; set; }
将ListView的SelectedItem绑定到此属性:
现在您只需检查SelectedUser
属性是否为null。
如何通过“选择项目做这两件事”
这通常可以使用视图模型中的SelectedSomething
属性来实现。 此属性应绑定到SelectedItem
的控件。
并在关闭面板之前检查是否有文本框字段中的任何文本
这称为“validation”。 WPF以多种方式支持validation,其中一种方法是在视图模型中实现IDataErrorInfo
。 我推荐这种方式,因为它是.NET的事实标准(它也用于WinForms和ASP .NET)。
一检查用户是否选择了项目。 如果他没有选择任何项目并单击“编辑按钮”它将向用户显示一个MessageBox以选择要编辑的项目
通常,这通过ICommand
实例解决,绑定到按钮。 如果ICommand.CanExecute
返回false,则绑定按钮将被禁用。
例如,您应检查CanExecute
for command中的validation错误,绑定到Close
按钮,如果有任何错误,则返回false。 或者,您应该在CanExecute
检查SelectedSomething
属性以获取命令,绑定到Edit
按钮,如果SelectedSomething == null
,则返回false
。
在MVVM中,如果使用RelayCommand
/ DelegateCommand
作为默认的ICommand
实现,事情会变得更容易。
更新 。
命令的代码示例。 查看型号:
public class UserViewModel { public UserViewModel() { EditCommand = new RelayCommand(EditSelectedUser, () => SelectedUser != null); } private void EditSelectedUser() { // some edit code here } public User SelectedUser { get; set; } public ICommand EditCommand { get; private set; } }
XAML: