2017-07-25 202 views
0

我有一个类名为 “员工”:WPF-组合框绑定

public string Forname { get; set; } 
public string Lastname { get; set; } 
public EmployeeGroup Group { get; set; } 

一类 “EmployeeGroup”:

public string Groupname { get; set; } 
public short GroupID { get; set; } 

和WPF:

<ComboBox x:Name="cmbGroup" SelectedItem="{Binding Group}" HorizontalAlignment="Left" Margin="342,226,0,0" VerticalAlignment="Top" Width="129"/> 
<TextBox x:Name="txtForename" Text="{Binding Forname}" HorizontalAlignment="Left" Height="24" Margin="342,21,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="129" VerticalContentAlignment="Center" GotFocus="SelectText"/> 
<TextBox x:Name="txtLastname" Text="{Binding Lastname}" HorizontalAlignment="Left" Height="24" Margin="342,47,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="129" VerticalContentAlignment="Center" GotFocus="SelectText"/> 
<ListBox x:Name="lstEmployee" HorizontalAlignment="Left" Height="362" Margin="25,19,0,0" VerticalAlignment="Top" Width="217" SelectionChanged="lstEmployee_SelectionChanged"/> 

组合框和ListBox从代码隐藏文件(ObservableCollection)中获取源代码:

cmbGroup.ItemsSource = Database_Contract.GetListOfContract(); 
lstEmployee.ItemsSource = Database_Employee.GetListOfEmployee(); 

我设置的DataContext当员工在列表框中选择在WPF的代码隐藏文件:

DataContext = lstEmployee.SelectedItem; 

与列表框的结合和文本框工作正常,但我有一个Combobox问题: 源代码工作,意味着我可以选择不同的组。但是对选定的员工没有约束力。所以,当我选择员工时,带有前缀和姓氏的文本框填充正确,但组合框是空格。但是当我点击Combobox时,我可以从给定的组中选择。

那么我做错了什么?

编辑: 当我将ComboBox.SelectedIndex绑定到Group.GroupID,然后它的工作。但不能保证GroupID和ComboBox-Index是相同的。

+0

在你的xaml中是一个名为cmbGroup的'ComboBox',你正在设置名为cmbContract的'ComboBox'的'ItemsSource'。这有点令人困惑。 可以肯定的是:你的'ComboBox'中的项目对每个员工都是一样的,当你在'ListBox'中选择一个员工时,你想选择'ComboBox'中的匹配条目? –

+0

需要注意的是,您可以不用更改Window的(?)DataContext,而是使用'Text =“{Binding SelectedItem.Lastname,ElementName = lstEmployee}''编写您的绑定。 – Clemens

+0

您还必须确保SelectedItem属性绑定的组实例实际上包含在ListBox的ItemsSource集合中。如果它们是不同的对象,则可以覆盖EmployeeGroup类的Equals方法。 – Clemens

回答

0

我找到了解决方案... 我已经更改为MVVM,将cmbGroup的绑定设置为ListOfGroup,重写了EmployeeGroup类的GetHashCode和Equals方法,并且它可以工作。 谢谢你们!

0

我认为问题是当您将整个视图的DataContext设置为选定的员工。
这也有效地改变了组合框的绑定上下文,所以所有的绑定都在改变。

我建议你给自己在代码中SelectedEmployee属性,并设置在selectedItemChanged事件,然后您可以更改绑定的文本框来读取Text="{Binding SelectedEmployee.Forname}"

你可能会发现,价值赢得”当你这样做时,屏幕会自动更新,这是因为你需要在你的表单代码中实现INotifyPropertyChanged,然后从属性设置器中调用OnPropertyChanged来告诉绑定刷新。

+0

“将整个视图的DataContext设置为选定的Employee,这也有效地改变了组合框的绑定上下文,因此所有绑定都在改变”不是问题,而是OP想要做什么。 – Clemens