Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用xaml绑定更改codebehind中的更新itemsource_C#_Wpf_Xaml_Binding_Combobox - Fatal编程技术网

C# 不使用xaml绑定更改codebehind中的更新itemsource

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

问题是我正在运行时更改项集合,无法更新组合框以显示新项。我希望通过xaml实现这一点

我想为单个combobox解决这个问题,然后将datagrid作为datagridComboBoxColumn或包含combobox作为datatemplate的templatecolumn来解决

我有这样的代码:

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}"/>