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

3

我一直在尝试使用MVVM开发模式在WPF中创建一个相当简单的应用程序,但是似乎做起来很困难。我已经在Forms中创建了这个应用程序,并成功运行,但是我的老板要求我将界面重写为WPF以展示该技术。为了使应用程序和代码尽可能教育性,我决定尽可能遵循最佳实践。我目前的困境是使用ListBox每次更改选择时运行一些代码。我准备使用代码后台和事件来调用视图模型上的方法。对我来说,这似乎仍然是基本的MVVM,因为没有执行逻辑。感谢任何帮助/见解。

5个回答

2

在您的ViewModel中可以创建一个名为“SelectedItem”的属性。然后将ListBox的SelectedItem属性绑定到您的属性。

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

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; }
        }
    }

这确实帮助我找到了正确的方向。谢谢。 - Paul
那其实很好。但是当你不幸需要绕过一个好的属性,比如 Loaded 事件时,你将需要一些 EventToCommand 框架。 - Philippe Lavoie

1

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

在我看来,设计模式应该始终被视为经验法则,并带有一些判断力,因为很容易在不适当的领域过度应用它们,这通常会使事情变得更糟。


我在这里倾向于同意你的看法,但幸运的是,看起来有一些更简单的方法可以做到这一点,而不必像我想象中那样跳过所有的障碍。 - Paul
@pauleck1 - 如果你觉得自己在不必要地跳跃,那么现在可能是时候退一步,重新考虑你是否采取了正确的方法。有很多MVVM框架,很容易过度设计并使你的代码难以维护(这有点违背了初衷)。我并不是说MVVM不好,当我使用WPF时,它肯定是我的首选武器。 - Moonshield

0

我需要深入检查一下。尽管如此,我真的希望避免向项目添加另一个框架。 - Paul

0

你可以绑定到 ListBox.SelectedItem 来获取在你的 vm 中选中的项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接