我一直在尝试使用MVVM开发模式在WPF中创建一个相当简单的应用程序,但是似乎做起来很困难。我已经在Forms中创建了这个应用程序,并成功运行,但是我的老板要求我将界面重写为WPF以展示该技术。为了使应用程序和代码尽可能教育性,我决定尽可能遵循最佳实践。我目前的困境是使用ListBox每次更改选择时运行一些代码。我准备使用代码后台和事件来调用视图模型上的方法。对我来说,这似乎仍然是基本的MVVM,因为没有执行逻辑。感谢任何帮助/见解。
在您的ViewModel中可以创建一个名为“SelectedItem”的属性。然后将ListBox的SelectedItem属性绑定到您的属性。
<Grid Canvas.Left="0" Canvas.Bottom="0" Height="300" Width="300" Background="Bisque">
<ListBox ItemsSource="{Binding Employes}" SelectedItem="{Binding SelectedEmploye}"/>
</Grid>
视图模型
public class ViewModel : ViewModelBase
{
private List<Employee> _employes;
public List<Employee> Employes
{
get { return _employes; }
set { _employees = value; OnPropertyChanged("Employes"); }
}
private Employee _selectedEmploye;
public Employee SelectedEmploye
{
get { return _selectedEmploye; }
set
{
_selectedEmployee = value;
OnPropertyChanged("SelectedEmploye");
}
}
}
视图模型基础
public class ViewModelBase : INotifyPropertyChanged
{
protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
员工类
public class Employee : ViewModelBase
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
不要害怕使用代码后台。没有代码后台是为了避免将太多逻辑放置在视图中而制定的指南,而不是一条硬性规定。在这种情况下(正如其他人建议的那样),您可以将SelectedItem属性绑定到视图模型上的某个属性。对于非数据相关事件,我的建议是像处理普通事件一样处理事件,并将执行逻辑委托给视图模型。
在我看来,设计模式应该始终被视为经验法则,并带有一些判断力,因为很容易在不适当的领域过度应用它们,这通常会使事情变得更糟。
你可以绑定到 ListBox.SelectedItem 来获取在你的 vm 中选中的项。
Loaded
事件时,你将需要一些EventToCommand
框架。 - Philippe Lavoie