在MVVM中为WPF实现简单的Master-Detail场景

时间:2009-07-25 21:57:54

标签: wpf data-binding mvvm

我有一个使用MVVM的WPF应用程序。我有一些用户控件,应该使用简单的数据绑定在3个Textbox控件中显示Person FirstName,LastName和email。

用户控件有一个简单的组合框,用户可以在其中选择用户的ID,因此应该加载具有该ID的人员记录(从数据库中提取数据),然后将显示FirstName,LastName和Email。文本框。

我有一个Usercontrol,其中包含三个属性的ID和3个文本框的组合框,一个ViewModel类和一个具有三个属性(FirstName,LastName和Email)的Model类(person类)。

使用MVVM(最好)实现此行为的最简单方法是什么?任何样品?

1 个答案:

答案 0 :(得分:6)

我猜这里是因为你的问题有点模糊,以至于你不太确定如何把各个部分挂钩。为简单起见,我们将ViewModel直接挂钩到用户控件并将其全部绑定。

只要您的视图模型使用正确的人员集填充,下面的所有绑定都将处理数据并显示正确的数据。记下组合框中所选项目的双向绑定。这允许WPF将新选择的项目发送回viewmodel。

在UserControl的代码背后:

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

在UserControl的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}" />

您的ViewModel:

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