我制作了一个关于电影和演员的 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 中。 我希望我已经提供了足够的信息来理解我的问题,如果没有,请说明,我会为您提供。
提前致谢!
我想你正在寻找这样的东西:
private void comboBoxExistingActors_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBoxFirstName.Text = ((Actor)comboBoxExistingActors.SelectedItem).FirstName;
}
使用以下代码:
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。这样一来, 当前选定的项目会自动同步以匹配视图的当前位置,而无需 需要代码。
推荐的实现方法是使用 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}" />
如果您有一个具有多个属性的复杂项目,这对我有用。将这两行(根据情况将“内容”更改为“文本”)添加到您的标签/文本框:
DataContext =“{绑定元素名称=ComboboxName,路径=所选项目}”
内容 =“{绑定元素名称=ComboboxName,路径=SelectedItem.PropertyName}”
将 ComboboxName 替换为组合框名称,并将 PropertyName 替换为所需的显示值 ID(例如 SelectedItem.DeviceID)