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

Ema*_*iel 3 data-binding wpf mvvm

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

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

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

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

Ray*_*sen 6

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

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

在UserControl的代码后面:

public MyUserControl()
{
  DataContext = new MyViewModel();
}
Run Code Online (Sandbox Code Playgroud)

在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}" />
Run Code Online (Sandbox Code Playgroud)

你的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; }
}
Run Code Online (Sandbox Code Playgroud)