2011-07-28 25 views
3

我一直在试图建立在WPF继MVVM开发模式相当简单的应用程序,但我已经准备在它看来多么困难是做简单的事情疯狂。我已经在Forms中创建了这个应用程序,并且它已经成功运行,但是我的老板要求我将WPF中的接口重写为该技术的演示。为了使应用程序和代码尽可能具有教育性,我决定尽量遵循尽可能多的最佳做法。我目前的困境是每次选择更改时都使用一个列表框来运行一些代码。我准备好使用带事件的代码隐藏来调用视图模型上的方法。对我来说,这似乎仍然是MVVM,因为没有逻辑执行。感谢任何帮助/见解。有没有简单的方法将命令绑定到MVVM WPF中的列表框?

回答

2

你可以做列表框,简单地结合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; } 
     } 
    } 
+0

这真的有助于指向正确的方向。谢谢。 – Paul

+0

这其实很好。但是当你不幸有一个很好的解决方案时,比如'Loaded'事件,你需要一些'EventToCommand'框架。 –

2

在您的视图模型,你可以创建一个属性 “的SelectedItem”。然后将SelectedItem属性绑定到您的ListBox属性中。

  • 如果它是POCO clr属性(INotifyPropertyChanged),那么您可以从属性设置器中触发您的代码。
  • ,如果它是一个DependencyProperty,你必须添加一个PropertyChangedCallback,并从那里触发你的代码。
1

不要害怕使用代码隐藏。没有代码隐藏是避免在视图中放置太多逻辑的指南,而不是一条硬性规则。在这种情况下(正如其他人所建议的那样),您可以将SelectedItem属性绑定到viewmodel上的某个属性。对于与数据无关的事件,我的建议是正常处理事件,并将执行逻辑委托给视图模型。

在我看来,设计模式应始终被视为经验法则,并与一些判断使用,因为它是很容易过于严格执行他们在不属于他们,这通常使事情变得更糟的区域。

+0

我倾向于在这里同意你的观点,但幸运的是,看起来有一些更简单的方法可以做到这一点,而不会跳过所有我认为必须做的事情。 – Paul

+0

@ pauleck1 - 如果你觉得你不必要地跳过篮球,那么现在是时候退后一步,重新考虑你是否采取了正确的做法。随着所有MVVM框架的出现,很容易无望地过度设计事物并使代码更难以维护(这有点失败了)。不是说我在说MVVM是坏的,它当然是我使用WPF的首选武器。 – Moonshield

0

可以绑定到ListBox.SelectedItem让你的虚拟机所选择的项目。