我制作了一个关于电影和演员的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。 我希望我提供了足够的信息来理解我的问题,如果没有,请说出来,我会为你提供。
提前致谢!
答案 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}" />