我有一个名为“员工”的 class :
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"/>
ComboBox和ListBox从代码隐藏文件(ObservableCollection)获取源代码:
cmbGroup.ItemsSource = Database_Contract.GetListOfContract();
lstEmployee.ItemsSource = Database_Employee.GetListOfEmployee();
当我在wpf的代码隐藏文件中的ListBox中选择了一个员工时,我设置了DataContext:
DataContext = lstEmployee.SelectedItem;
与ListBox和TextBoxes的绑定工作正常,但我有一个组合框的问题:源工作,意味着我可以选择不同的组 . 但是对所选员工没有约束力 . 因此,当我选择员工时,前缀和姓氏的文本框填充正确,但Combobox就是emtpy . 但是当我点击Combobox时,我可以从给定的组中进行选择 .
那我做错了什么?
编辑:当我将ComboBox.SelectedIndex的绑定设置为Group.GroupID时,它可以工作 . 但是不能保证GroupID和ComboBox-Index是一样的 .
2 回答
我认为问题是当您将整个视图的DataContext设置为所选的Employee时 .
这有效地改变了组合框的绑定上下文,因此所有绑定都在变化 .
我建议你在代码中给自己一个SelectedEmployee属性并在selectedItemChanged事件中设置它,然后你可以改变文本框的绑定来读取
Text="{Binding SelectedEmployee.Forname}"
您可能会发现在执行此操作时屏幕上的值不会自动更新,这是因为您需要在表单代码中实现
INotifyPropertyChanged
,然后从属性设置器调用OnPropertyChanged以告知绑定刷新 .我找到了一个解决方案...我已经改为MVVM,将cmbGroup的绑定设置为ListOfGroup,重写了EmployeeGroup类的GetHashCode和Equals方法,并且它可以工作 . 多谢你们!