我一直在尝试在MVVM开发模式之后在WPF中创建一个相当简单的应用程序,但我一直在为简单的事情看起来很困难。我已经在Forms中创建了这个应用程序,并且已成功运行,但我的老板要求我在WPF中重写接口作为该技术的演示。我决定尽可能多地遵循尽可能多的最佳实践,以使应用程序和代码尽可能具有教育意义。我目前的困境是每次选择更改时使用列表框运行一些代码。我已经准备好使用代码隐藏与事件来调用视图模型上的方法。对我来说,这似乎仍然是MVVM,因为没有逻辑执行。感谢您的帮助/见解。
答案 0 :(得分:2)
在ViewModel中,您可以创建属性“SelectedItem”。如果您的ListBox属性,则绑定SelectedItem属性。
答案 1 :(得分:2)
你可以简单地绑定listbox的selecteditem属性......在选择更改时,将调用视图模型中的setter,你可以随心所欲地做任何事情......
以下是一个可以帮助您的示例
<强> XAML 强>
<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; }
}
}
答案 2 :(得分:1)
不要害怕使用代码隐藏。没有代码隐藏是避免在视图中放置过多逻辑的指南,而不是一个硬性规则。在这种情况下(正如其他人所建议的那样),您可以将SelectedItem属性绑定到viewmodel上的某个属性。对于非数据相关的事件,我的建议是正常处理事件并将执行逻辑委托给viewmodel。
在我看来,设计模式应该始终作为经验法则并用于判断,因为在不属于它们的区域中将它们过于严格地应用非常容易,这通常会使事情变得更糟。
答案 3 :(得分:0)
答案 4 :(得分:0)
您可以绑定到ListBox.SelectedItem以获取虚拟机中的选定项目。