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

问题描述 投票:0回答:4

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

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

我的演员有演员 ID、名字、姓氏、国家/地区和出生日期。 如果我想创建一个新的演员,我只需填写这些内容并单击“保存”,它就会创建一个新的演员。保存的事情现在并不重要。

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

现在,当我从此组合框中选择演员时,我希望我的文本框能够填写演员的详细信息:

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

我不确定是否这么简单,但我需要一种方法将所选演员的 act.Firstname 放入 textBoxFirstName 中。 我希望我已经提供了足够的信息来理解我的问题,如果没有,请说明,我会为您提供。

提前致谢!

c# wpf combobox textbox
4个回答
2
投票

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

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 属性将设置为您在 ComboBox 中选择的 Actor 对象,并且只要视图模型类实现 INotifyPropertyChanged 接口并在 setter 的 setter 中引发 PropertyChanged 事件,数据绑定的 TextBox 就会自动刷新。 SelectedActor 源属性。

您还可以将文本框直接绑定到组合框:

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

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

0
投票

如果您有一个具有多个属性的复杂项目,这对我有用。将这两行(根据情况将“内容”更改为“文本”)添加到您的标签/文本框:

DataContext =“{绑定元素名称=ComboboxName,路径=所选项目}”
内容 =“{绑定元素名称=ComboboxName,路径=SelectedItem.PropertyName}”

ComboboxName 替换为组合框名称,并将 PropertyName 替换为所需的显示值 ID(例如 SelectedItem.DeviceID)

© www.soinside.com 2019 - 2024. All rights reserved.