WPF根据所选项目组合框填写文本框

时间:2017-01-08 04:14:05

标签: c# wpf combobox textbox

我制作了一个关于电影和演员的WPF项目(编程新手)。

现在我可以通过输入他的名字,国家,bday等手动创建一个新演员(链接到电影)。由于我添加了越来越多的数据,我希望有可能选择来自组合框的现有演员,然后他的姓名,国家/地区,bday等会自动填写我通常手动添加新信息的文本框。

我的演员有一个ActorID,FirstName,LastName,Country和Birthdate。 如果我想创建一个新的actor,我只需填写这些内容并单击save,它就会创建一个新的actor。保存的东西现在并不重要。

在Actor.cs中,我声明了这些:

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

然后这些被称为act.FirstName等

我的组合框称为:comboBoxExistingActors,它的项目源是:

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

现在我喜欢当我从这个组合框中选择一个演员时,我的文本框会填写演员的详细信息:

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

我不确定它是否如此简单,但我需要一种方法将所选actor中的act.Firstname转换为textBoxFirstName。 我希望我提供了足够的信息来理解我的问题,如果没有,请说出来,我会为你提供。

提前致谢!

3 个答案:

答案 0 :(得分:1)

我认为你正在寻找这样的东西:

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

答案 1 :(得分: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。那样的话 当前所选项目将自动同步,以匹配视图的当前位置 需要的代码。

答案 2 :(得分: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属性将是您在ComboBox中选择的Actor对象的设置,并且数据绑定TextBoxes将自动刷新,前提是视图模型类实现INotifyPropertyChanged接口并在setter中引发PropertyChanged事件的SelectedActor源属性。

您还可以将TextBox直接绑定到ComboBox:

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

<TextBox Text="{Binding SelectedItem.FirstName, ElementName=cmb}" />