问题是我在运行时更改了项目的集合,我无法让组合框更新以显示新项目。我想通过 xaml 来实现这一点。
我想为单个组合框解决这个问题,然后也为数据网格解决这个问题,或者作为 datagridComboBoxColumn 或者作为包含作为数据模板的组合框的模板列。
我有这样的代码:
public class Member
{
public string PublicID {get; set;}
public string Description {get; set;}
}
public ObservableCollection<Member> ComboBoxSource;
public UpdateComboBoxContents()
{
List<Member> newList;
// Omitted Code to retrieve list from datasource..
ComboBoxSource = new ObservableCollection<Member>(newList);
// If I uncomment the next line, combobox will show new contents:
//myComboBox.itemssource = ComboBoxSource;
// I’ve also tried..
OnPropertyChanged("ComboBoxListSource");
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string Name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(Name));
}
}
在哪里:
public partial class MyForm: UserControl, INotifyPropertyChanged
组合框 xaml 看起来像:
<ComboBox Name="myComboBox" SelectedValuePath="PublicID"
DisplayMemberPath="Description" ItemsSource="{Binding ComboBoxListSource,
UpdateSourceTrigger=PropertyChanged}"/>
我想我搞砸了绑定或实现 INotifyPropertyChanged。在调试中,我注意到处理程序始终为 null,因此不会引发事件。
对于这个问题的第二部分(实现到数据网格),我有:
public observableCollection<DatarowWithMember> ListDataRowWithMember;
// Code to populate list..
myDataGrid.Itemsource = ListDataRowWithMember
其中 DataRowWithMember 是一个实现 INotifyPropertyChanged 并具有 MemberID 属性的类,该属性应指向 Member 的 PublicID
我试过这个xaml:
<DataGridTemplateColumn Header="Group" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ComboBoxListSource,
RelativeSource={RelativeSource AncestorType=UserControl}}"
SelectedValue="{Binding MemberID, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Description"
SelectedValuePath="PublicID"
IsHitTestVisible="False" SelectionChanged="ComboBoxChanged">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ComboBoxListSource,
RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Description" SelectedValuePath="PublicID"
SelectedValue="{Binding MemberID,
UpdateSourceTrigger=PropertyChanged}"
SelectionChanged="ComboBoxChanged"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
解决方案:正如其他人指出的那样,我在 ComboBoxSource 和 ComboBoxListSource 上有一个错字——这不是代码问题,而是我写出这个问题时的错误。
检查输出窗口确实显示了绑定问题,即找不到属性 ComboBoxSource。我改为:
private ObservableCollection<Member> _ComboBoxSource = new ObservableCollection<Member>()
public ObservableCollection<Member> ComboBoxSource
{
get { return _ComboBoxSource; }
}
那行得通。类属性与成员?