代码之家  ›  专栏  ›  技术社区  ›  Emad Gabriel

在mvvm中实现wpf的简单主细节场景

  •  3
  • Emad Gabriel  · 技术社区  · 15 年前

    我有一个使用mvvm的wpf应用程序。我有一些用户控件应该使用简单的数据绑定在3个文本框控件中显示一个人的名字、姓氏和电子邮件。

    用户控件有一个简单的组合框,用户在其中选择用户的id,因此应该加载具有该id的个人记录(其数据从数据库中获取),然后firstname、lastname和email将显示在文本框中。

    我有一个带有id组合框的usercontrol和三个属性的3个文本框,一个viewmodel类和一个带有三个属性(firstname、lastname和email)的模型类(person类)。

    使用mvvm(最好)实现此行为的最简单方法是什么?有样品吗?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Ray Booysen    13 年前

    我在这里猜测,因为你的问题有点含糊,你不太清楚如何把这些部分连接起来。为了简单起见,让我们将viewmodel直接挂接到用户控件上,并获得它的所有绑定。

    只要视图模型中填充了正确的人员集,下面的所有绑定都将处理数据并显示正确的数据。注意组合框中选定项的双向绑定。它允许wpf将新的选定项发送回viewmodel。

    在用户控件的代码隐藏中:

    public MyUserControl()
    {
      DataContext = new MyViewModel();
    }
    

    在用户控件的xaml中:

    <ComboBox ItemsSource="{Binding AllPeople}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
    <TextBox Text="{Binding SelectedItem.LastName}" />
    <TextBox Text="{Binding SelectedItem.FirstName}" />
    <TextBox Text="{Binding SelectedItem.EmailName}" />
    

    您的视图模型:

    private IEnumerable<Person> _allPeople;
        public IEnumerable<Person> AllPeople
        {
            get { return _allPeople; }
            set
            {
                if (_allPeople != value)
                {
                    _allPeople = value;
                    NotifyPropertyChanged("AllPeople");
                }
            }
        }
    
        private Person _selectedItem;
        public Person SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                if (!_selectedItem != value)
                {
                    _selectedItem = value;
                    NotifyPropertyChanged("SelectedItem");
                }
            }
        }
    
        private void NotifyPropertyChanged(string propertyName)
        {
           if ( PropertyChanged != null)
           {
             PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
           }
        }
    }
    
    public class Person
    {
     public int PersonId { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public string Email { get; set; }
    }