0

问题是我在运行时更改了项目的集合,我无法让组合框更新以显示新项目。我想通过 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; }
}

那行得通。类属性与成员?

4

2 回答 2

1

UpdateComboBoxContent导致你有两个问题。

首先,您的属性被调用ComboBoxSource,而在方法中,您调用属性更改为“组合框列表源”。

其次,您根本不需要覆盖ObservableCollectionObservableCollection可以自己通知绑定。ComboBoxSource.Clear()如果您不能仅更新已更改的项目,则不要覆盖它,而是调用并使用新数据填充它。

此外,永远不要让myComboBox.itemssource = ComboBoxSource;你这样做打破你的绑定。如果您想使用后面的代码绑定属性,请参阅:http: //msdn.microsoft.com/en-us/library/ms742863.aspx

于 2013-09-09T08:55:32.953 回答
0

从看起来您将属性名称 ComboBoxSource 和 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}"/>
于 2013-09-09T08:55:10.407 回答