我一直在试图建立在WPF继MVVM开发模式相当简单的应用程序,但我已经准备在它看来多么困难是做简单的事情疯狂。我已经在Forms中创建了这个应用程序,并且它已经成功运行,但是我的老板要求我将WPF中的接口重写为该技术的演示。为了使应用程序和代码尽可能具有教育性,我决定尽量遵循尽可能多的最佳做法。我目前的困境是每次选择更改时都使用一个列表框来运行一些代码。我准备好使用带事件的代码隐藏来调用视图模型上的方法。对我来说,这似乎仍然是MVVM,因为没有逻辑执行。感谢任何帮助/见解。有没有简单的方法将命令绑定到MVVM WPF中的列表框?
回答
你可以做列表框,简单地结合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;
}
Employee类
public class Employee : ViewModelBase
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
在您的视图模型,你可以创建一个属性 “的SelectedItem”。然后将SelectedItem属性绑定到您的ListBox属性中。
- 如果它是POCO clr属性(INotifyPropertyChanged),那么您可以从属性设置器中触发您的代码。
- ,如果它是一个DependencyProperty,你必须添加一个PropertyChangedCallback,并从那里触发你的代码。
不要害怕使用代码隐藏。没有代码隐藏是避免在视图中放置太多逻辑的指南,而不是一条硬性规则。在这种情况下(正如其他人所建议的那样),您可以将SelectedItem属性绑定到viewmodel上的某个属性。对于与数据无关的事件,我的建议是正常处理事件,并将执行逻辑委托给视图模型。
在我看来,设计模式应始终被视为经验法则,并与一些判断使用,因为它是很容易过于严格执行他们在不属于他们,这通常使事情变得更糟的区域。
我倾向于在这里同意你的观点,但幸运的是,看起来有一些更简单的方法可以做到这一点,而不会跳过所有我认为必须做的事情。 – Paul
@ pauleck1 - 如果你觉得你不必要地跳过篮球,那么现在是时候退后一步,重新考虑你是否采取了正确的做法。随着所有MVVM框架的出现,很容易无望地过度设计事物并使代码更难以维护(这有点失败了)。不是说我在说MVVM是坏的,它当然是我使用WPF的首选武器。 – Moonshield
可以绑定到ListBox.SelectedItem让你的虚拟机所选择的项目。
- 1. ListBoxItem的MVVM命令中的WPF列表框的命令绑定
- 2. 有没有简单的方法绑定到WPF中的父行?
- 3. WPF:将ContextMenu绑定到MVVM命令
- 4. 简单的WPF + MVVM绑定
- 5. WPF命令绑定到MVVM的DataItemTemplate
- 6. MVVM WPF - Viewmodel命令绑定
- 7. 有没有办法将代表命令绑定到图像?
- 8. WPF MVVM:绑定命令到事件
- 9. WPF日历:绑定到MVVM命令?
- 10. 将实体绑定到WPF表单MVVM
- 11. WPF列表框绑定没有显示
- 12. 使用MVVM在WPF中绑定命令
- 13. 简单的WPF MVVM绑定问题
- 14. 将命令绑定到WPF中的ComboBoxItem
- 15. 将ComboBoxItem绑定到WPF中的命令?
- 16. 命令绑定MVVM
- 17. 将列表框绑定到列表中的简单方法<string>在wpf中,安全更新
- 18. 有没有办法将数据绑定到WPF中编辑的双打列表?
- 19. WPF列表框与MVVM绑定
- 20. MVVM命令绑定
- 21. 为列表框内的复选框命令和命令参数WPF/MVVM绑定不同的源
- 22. 有没有办法将DataTrigger绑定到WPF中的模板?
- 23. WPF MVVM ContextMenu绑定到ObservableCollection <string>不命中命令
- 24. WPF MVVM内的DataTemplate绑定到列表框的SelectedItem父列表框的
- 25. 绑定命令MVVM
- 26. 如何将命令绑定到祖先datacontext? WPF :: MVVM
- 27. 将命令绑定到ListView项MVVM正确的方式
- 28. 将单选按钮绑定到SQL表中的简单方法#
- 29. 上下文菜单项命令绑定使用MVVM的WPF
- 30. 将列表绑定到WPF中的列表框中
这真的有助于指向正确的方向。谢谢。 – Paul
这其实很好。但是当你不幸有一个很好的解决方案时,比如'Loaded'事件,你需要一些'EventToCommand'框架。 –