有没有一种简单的方法将命令绑定到MVVM WPF中的列表框?

时间:2011-07-28 15:33:03

标签: c# wpf mvvm

我一直在尝试在MVVM开发模式之后在WPF中创建一个相当简单的应用程序,但我一直在为简单的事情看起来很困难。我已经在Forms中创建了这个应用程序,并且已成功运行,但我的老板要求我在WPF中重写接口作为该技术的演示。我决定尽可能多地遵循尽可能多的最佳实践,以使应用程序和代码尽可能具有教育意义。我目前的困境是每次选择更改时使用列表框运行一些代码。我已经准备好使用代码隐藏与事件来调用视图模型上的方法。对我来说,这似乎仍然是MVVM,因为没有逻辑执行。感谢您的帮助/见解。

5 个答案:

答案 0 :(得分:2)

在ViewModel中,您可以创建属性“SelectedItem”。如果您的ListBox属性,则绑定SelectedItem属性。

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

答案 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)

查看Galasoft MVVM Light

中的EventToCommand行为

Here's the SO post

答案 4 :(得分:0)

您可以绑定到ListBox.SelectedItem以获取虚拟机中的选定项目。