【问题标题】:WPF- Combobox BindingWPF- 组合框绑定
【发布时间】:2017-07-25 10:11:55
【问题描述】:

我有一个名为“employee”的班级:

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 的问题: 源代码有效,意味着我可以选择不同的组。但是对选定的员工没有约束力。因此,当我选择员工时,带有前名和姓氏的 TextBoxes 填写正确,但 Combobox ist emtpy。但是当我单击组合框时,我可以从给定的组中进行选择。

那么我做错了什么?

编辑: 当我将 ComboBox.SelectedIndex 的绑定设置为 Group.GroupID 时,它就可以工作了。但不保证 GroupID 和 ComboBox-Index 相同。

【问题讨论】:

  • 在您的 xaml 中是一个名为 cmbGroup 的 ComboBox,并且您正在设置一个名为 cmbContract 的 ComboBox 的 ItemsSource。这有点令人困惑。可以肯定的是:ComboBox 中的项目对于每个员工都是相同的,当您在 ListBox 中选择员工时,您想在 ComboBox 中选择匹配的条目?
  • 请注意,您可以编写像 Text="{Binding SelectedItem.Lastname, ElementName=lstEmployee}" 这样的绑定,而不是更改 Window 的 (?) DataContext。
  • 您还必须确保 SelectedItem 属性绑定到的 Group 实例实际上包含在 ListBox 的 ItemsSource 集合中。如果它们是不同的对象,您可以重写 EmployeeGroup 类的 Equals 方法。
  • @Mighty,我打错了,现在正确了
  • @Clemens,我很确定它是同一个对象,但是有没有办法验证它?

标签: c# wpf combobox binding custom-lists


【解决方案1】:

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

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

您可能会发现执行此操作时值不会在屏幕上自动更新,这是因为您需要在表单代码中实现INotifyPropertyChanged,然后从属性设置器中调用 OnPropertyChanged 来告知绑定刷新。

【讨论】:

  • "将整个视图的 DataContext 设置为选定的 Employee,这也有效地改变了组合框的绑定上下文,因此所有的绑定都在改变"不是问题,但究竟是什么OP想做的事。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2011-03-09
    • 2015-09-15
    • 2018-01-17
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多