2017-01-08 2 views
0

Я создал проект WPF о фильмах и актерах (новичок в программировании).WPF заполнить текстовое поле на основе выбранного элемента combobox

На данный момент я могу создать нового актера (связанного с фильмом) вручную, введя его имя, страну, bday и т. Д. Так как я добавляю все больше и больше данных, Мне бы хотелось, чтобы выбрать существующего участника из combobox, а затем его имя, страна, bday и т. д. будут автоматически заполняться в текстовых полях, которые я предоставил, где вы обычно добавляете новую информацию вручную.

У моего актора есть ActorID, FirstName, LastName, Country и Birthdate. Если я хочу создать нового актера, я просто заполняю эти вещи и нажимаю save, и это создает нового актера. В настоящее время вещь сохранения не очень важна.

В Actor.cs я объявил эти:

public class Actor 
{ 
    public int ActorID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    //Etc. 
} 

И тогда они называются act.FirstName и т.д.

Мой выпадающий называется: comboBoxExistingActors и это ItemSource является:

 comboBoxExistingActors.ItemsSource = ActorRepository.ActorList(); 

Этот ActorList определен в моем ActorRepository:

public static List<Actor> ActorList() 
    { 
     string command = "SELECT DISTINCT FirstName, LastName FROM tblActors ORDER BY tblActors.LastName"; 
     OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString); 
     DataTable datatable = new DataTable(); 
     adapter.Fill(datatable); 

     List<Actor> lijst = new List<Actor>(); 

     for (int i = 0; i < datatable.Rows.Count; i++) 
     { 
      Actor act = new Actor(); 

      act.FirstName = datatable.Rows[i].Field<string>("FirstName"); 
      act.LastName = datatable.Rows[i].Field<string>("LastName"); 

      lijst.Add(act); 
     } 
     return lijst; 
    } 

Теперь я хотел бы, чтобы мой Textboxes заполнит в деталях актера при выборе актера из этого выпадающего списка:

private void comboBoxExistingActors_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     textBoxFirstName.Text = ??? 
     //textBoxLastname etc. 
    } 

Я не уверен, если это это просто, но мне нужен способ, чтобы получить my act.Firstname от выбранного участника в textBoxFirstName. Надеюсь, я предоставил достаточно информации, чтобы понять мою проблему, если не скажу так, и я дам вам ее.

Заранее благодарен!

ответ

1

Я думаю, что вы ищете что-то вроде этого:

private void comboBoxExistingActors_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    textBoxFirstName.Text = ((Actor)comboBoxExistingActors.SelectedItem).FirstName; 
} 
0

используют следующие коды:

private ListCollectionView view; 
ICollection<Actor> actors= GetActors(); 
this.DataContext = actors; 
view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.DataContext); 

в XAML:

<ComboBox Name="lstActors" DisplayMemberPath="FirstName" 
Text="{Binding Path=FirstName}" 
SelectionChanged="lstActors_SelectionChanged"></ComboBox> 

<TextBox Text="{Binding Path=FistName}"/> 
<TextBox Text="{Binding Path=LastName}"/> 
<TextBox Text="{Binding Path=ActorID}"/> 

и SelectionChanged события:

private void lstActors_SelectionChanged(object sender, RoutedEventArgs e) 
{ 
view.MoveCurrentTo(lstActors.SelectedItem); 
} 

Простым решением является установить для параметра ItemsControl.IsSynchronizedWithCurrentItem значение true. Таким образом, текущий выбранный элемент автоматически синхронизируется в соответствии с текущей позицией вида без необходимости .

0

Рекомендуемый способ реализовать это было бы использовать MVVM шаблон проектирования: https://msdn.microsoft.com/en-us/library/hh848246.aspx

Создать класс вид модели:

public class ActorViewModel : INotifyPropertyChanged 
{ 
    public ActorViewModel() 
    { 
     Actors = ActorRepository.ActorList(); 
    } 

    public List<Actor> Actors { get; private set; } 

    private Actor _selectedActor; 
    public Actor SelectedActor 
    { 
     get { return _selectedActor; } 
     set { _selectedActor = value; NotifyPropertyChanged(); } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

...и установить DataContext окна к экземпляру этого:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new ActorViewModel(); 
} 

Вы можете связать с любым свойством этого:

<ComboBox ItemsSource="{Binding Actors}" DisplayMemberPath="FirstName" 
        SelectedItem="{Binding SelectedActor}" /> 

<TextBox Text="{Binding SelectedActor.FirstName}" /> 
<TextBox Text="{Binding SelectedActor.LastName}" /> 

SelectedActor свойство модели представления будет набор для объект Actor, который вы выберете в ComboBox и текстовые поля данных, будет автоматически обновляться при условии, что класс модели представления реализует интерфейс INotifyPropertyChanged и поднимет событие PropertyChanged в настройщике свойства источника SelectedActor.

Вы также можете связать TextBoxes непосредственно к ComboBox:

<ComboBox x:Name="cmb" ItemsSource="{Binding Actors}" DisplayMemberPath="FirstName"/> 

<TextBox Text="{Binding SelectedItem.FirstName, ElementName=cmb}" /> 
Смежные вопросы