WPF-组合框绑定
WPF- Combobox Binding
我有一个 class 名为 "employee":
public string Forname { get; set; }
public string Lastname { get; set; }
public EmployeeGroup Group { get; set; }
一个class"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 的代码隐藏文件的列表框中 selected 时,我设置了 DataContext:
DataContext = lstEmployee.SelectedItem;
ListBox 和 TextBox 的绑定工作正常,但 Combobox 有问题:
来源有效,意味着我可以 select 不同的组。但是对 selected 员工没有约束力。因此,当我 select 员工时,带有名字和姓氏的文本框填写正确,但组合框是空的。但是当我单击组合框时,我可以从给定的组中进行选择。
那么我做错了什么?
编辑:
当我将 ComboBox.SelectedIndex 的绑定设置为 Group.GroupID 时,它就起作用了。但是不能保证GroupID和ComboBox-Index是一样的。
我认为问题出在将整个视图的 DataContext 设置为选定的 Employee 时。
这也有效地改变了组合框的绑定上下文,因此所有绑定都在改变。
我建议您在代码中给自己一个 SelectedEmployee 属性 并在 selectedItemChanged 事件中设置它,然后您可以将文本框的绑定更改为 Text="{Binding SelectedEmployee.Forname}"
您可能会发现执行此操作时屏幕上的值不会自动更新,这是因为您需要在表单代码中实现 INotifyPropertyChanged
,然后从 属性 设置器告诉绑定刷新。
我找到了解决方案...
我已更改为 MVVM,将 cmbGroup 的绑定设置为 ListOfGroup,覆盖了 class EmployeeGroup 的 GetHashCode 和 Equals 方法,并且它起作用了。
谢谢大家!
我有一个 class 名为 "employee":
public string Forname { get; set; }
public string Lastname { get; set; }
public EmployeeGroup Group { get; set; }
一个class"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 的代码隐藏文件的列表框中 selected 时,我设置了 DataContext:
DataContext = lstEmployee.SelectedItem;
ListBox 和 TextBox 的绑定工作正常,但 Combobox 有问题: 来源有效,意味着我可以 select 不同的组。但是对 selected 员工没有约束力。因此,当我 select 员工时,带有名字和姓氏的文本框填写正确,但组合框是空的。但是当我单击组合框时,我可以从给定的组中进行选择。
那么我做错了什么?
编辑: 当我将 ComboBox.SelectedIndex 的绑定设置为 Group.GroupID 时,它就起作用了。但是不能保证GroupID和ComboBox-Index是一样的。
我认为问题出在将整个视图的 DataContext 设置为选定的 Employee 时。
这也有效地改变了组合框的绑定上下文,因此所有绑定都在改变。
我建议您在代码中给自己一个 SelectedEmployee 属性 并在 selectedItemChanged 事件中设置它,然后您可以将文本框的绑定更改为 Text="{Binding SelectedEmployee.Forname}"
您可能会发现执行此操作时屏幕上的值不会自动更新,这是因为您需要在表单代码中实现 INotifyPropertyChanged
,然后从 属性 设置器告诉绑定刷新。
我找到了解决方案... 我已更改为 MVVM,将 cmbGroup 的绑定设置为 ListOfGroup,覆盖了 class EmployeeGroup 的 GetHashCode 和 Equals 方法,并且它起作用了。 谢谢大家!