C# 不使用xaml绑定更改codebehind中的更新itemsource
问题是我正在运行时更改项集合,无法更新组合框以显示新项。我希望通过xaml实现这一点 我想为单个combobox解决这个问题,然后将datagrid作为datagridComboBoxColumn或包含combobox作为datatemplate的templatecolumn来解决 我有这样的代码:C# 不使用xaml绑定更改codebehind中的更新itemsource,c#,wpf,xaml,binding,combobox,C#,Wpf,Xaml,Binding,Combobox,问题是我正在运行时更改项集合,无法更新组合框以显示新项。我希望通过xaml实现这一点 我想为单个combobox解决这个问题,然后将datagrid作为datagridComboBoxColumn或包含combobox作为datatemplate的templatecolumn来解决 我有这样的代码: public class Member { public string PublicID {get; set;} public string Description {get; se
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));
}
}
Combobox xaml看起来像:
<ComboBox Name="myComboBox" SelectedValuePath="PublicID"
DisplayMemberPath="Description" ItemsSource="{Binding ComboBoxListSource,
UpdateSourceTrigger=PropertyChanged}"/>
我觉得我在搞砸绑定或实现INotifyPropertyChanged。在调试中,我注意到处理程序总是空的,因此不会引发事件
对于这个问题的第二部分(在datagrid中实现),我有:
public observableCollection<DatarowWithMember> ListDataRowWithMember;
// Code to populate list..
myDataGrid.Itemsource = ListDataRowWithMember
public-observeCollection-ListDataRowWithMember;
//要填充列表的代码。。
myDataGrid.Itemsource=ListDataRowWithMember
其中DataRowWithMember是一个实现INotifyPropertyChanged的类,它具有一个MemberID属性,该属性应指向成员的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; }
}
private ObservableCollection\u ComboBoxSource=new ObservableCollection()
公共可观测集合ComboxSource
{
获取{return\u ComboBoxSource;}
}
这起作用了。类属性vs成员?从某种程度上看,您似乎将属性名称ComboxSource和PropertyCHanged事件参数与绑定混在了一起。您应该在以下所有位置使用与ComboBoxSource相同的名称:
public ObservableCollection<Member> ComboBoxSource;
public UpdateComboBoxContents()
{
List<Member> newList;
// Omitted Code to retrieve list from datasource..
ComboBoxSource = new ObservableCollection<Member>(newList);
// I’ve also tried..
OnPropertyChanged("ComboBoxSource");
}
<ComboBox Name="myComboBox" SelectedValuePath="PublicID"
DisplayMemberPath="Description" ItemsSource="{Binding ComboBoxSource,
UpdateSourceTrigger=PropertyChanged}"/>
public-observeCollection ComboxSource;
public updateComboxContents()
{
列表新建列表;
//省略了从数据源检索列表的代码。。
ComboBoxSource=新的ObservableCollection(新列表);
//我也试过。。
OnPropertyChanged(“ComboBoxSource”);
}
在updateComboxContent
中有两个问题会导致这种情况
首先,您的属性被称为ComboBoxSource
,而在方法中,您使用“ComboBoxListSource”调用属性changed
其次,您根本不需要覆盖observateCollection
ObservableCollection
可以自行通知绑定。如果无法仅更新更改的项目,请调用ComboBoxSource.Clear()
,然后用新数据填充它,而不是覆盖它
另外,不要设置
myComboBox.itemssource=ComboBoxSource代码>这样做会破坏绑定。如果要使用代码隐藏绑定属性,请参阅:如何设置usercontrol的DataContext。?如果实现INotifyPropertyChanged的类未设置为DataContext或未绑定到视图,则处理程序为null。在输出窗口内调试期间是否出现绑定表达式错误?在控件的初始化中,我得到DataContext=this;下次运行时,我将查找绑定表达式错误;我没有看到输出窗口;我现在就去!ComboBoxSource和ComboBoxListSource是我对SO问题的输入错误,我应该直接复制粘贴);但我会调查清楚&填充;谢谢你的链接;现在阅读。我已经用实际问题及其解决方案更新了我的问题;Jordy van Eijk为我指出了正确的方向,这实际上解决了问题;但是我选择这个作为正确答案是因为clear()的链接和使用。谢谢,但是你应该发布你自己的答案,并将其标记为问题的答案。你可以投票选出有帮助的答案,但你应该只把真正的解决方案作为答案;我写这个问题的错误
public ObservableCollection<Member> ComboBoxSource;
public UpdateComboBoxContents()
{
List<Member> newList;
// Omitted Code to retrieve list from datasource..
ComboBoxSource = new ObservableCollection<Member>(newList);
// I’ve also tried..
OnPropertyChanged("ComboBoxSource");
}
<ComboBox Name="myComboBox" SelectedValuePath="PublicID"
DisplayMemberPath="Description" ItemsSource="{Binding ComboBoxSource,
UpdateSourceTrigger=PropertyChanged}"/>