【发布时间】:2015-11-26 21:22:08
【问题描述】:
如果你能帮助我,我会很高兴。我是 WPF 的新手。
我遇到了关于 ComboBox 的问题。我正在使用 Ado.Net Entity Framework 5 从 MySql 服务器检索作业数据。我的 ComboBox 需要显示这些作业的 ID,并且它需要可编辑才能添加新 ID。问题是,一旦我输入了组合框中不存在的新 ID,然后按 ENTER,什么也没有发生。我需要在按 ENTER 后将新值添加到 ComboBox 的绑定列表中。我被告知要使用 LOSTFOCUS(因为 PropertyChange 将为每个击键调用,并且每个击键都将被视为组合框列表中的一个新值)但没有任何反应。我还被告知它与行为和命令有关。由于我是新手,我发现困难。 你能告诉我这个问题的解决方案吗? :)
Job.cs
public class Job {
public string JobId { get; set; }
public string JobTitle { get; set; }
}
MainWindow.xaml:
<ComboBox Name="JobIdComboBox" DisplayMemberPath="JobID" ItemsSource="{Binding JobsList, Mode=TwoWay}" SelectedItem ="{Binding JobSelectedItem}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="147" Margin="360,37,0,0" Grid.Row="1" Height="30" FontSize="18" IsReadOnly="False" IsEditable="True" Text="{Binding Path=JobNewItem,UpdateSourceTrigger=LostFocus}"/>
MainWindow.xaml.cs:
namespace JobsApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
}
}
MainViewModel.cs
public class MainViewModel:INotifyPropertyChanged
{
JobsDbEntities jobsDbEntitiesInstance = new JobsDbEntities();
public MainViewModel()
{
FillJobs();
}
private void FillJobs()
{
var q = (from Jobs in jobsDbEntitiesInstance.certificateheader
select Jobs).ToList();
JobsList = q;
}
private List<Job> _jobsList;
public List<Job> JobsList
{
get { return _jobsList; }
set
{
_jobsList = value;
OnPropertyChanged();
}
}
private Job _jobSelectedItem;
public Job JobSelectedItem
{
get { return _jobSelectedItem; }
set
{
_jobSelectedItem = value;
OnPropertyChanged();
}
}
private string _jobNewItem;
public string JobNewItem
{
get { return _jobNewItem; }
set
{
if (value != null)
{
_jobNewItem = value;
OnPropertyChanged();
var jobNewElement = new Job {JobID = _jobNewItem};
_jobsList.Add(jobNewElement);
JobSelectedItem = jobNewElement;
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
【问题讨论】: