当移回集合中的项目时,XAML组合框为空

当移回集合中的项目时,XAML组合框为空,xaml,observablecollection,Xaml,Observablecollection,我有一个组合框和一个标签: <!-- Does not select appropriate value after moving back to current item in collection --> <ComboBox ItemsSource="{Binding Path=Items}" SelectedValue="{Binding Path=SelectedItem, Mode=TwoWay}"

我有一个组合框和一个标签:

<!-- Does not select appropriate value after moving back to current item in collection -->
        <ComboBox
            ItemsSource="{Binding Path=Items}"
            SelectedValue="{Binding Path=SelectedItem, Mode=TwoWay}"
            DisplayMemberPath="ItemName" 
            Margin="8,2,8,16" />

<!-- Displays correctly after moving back to current item in collection -->
        <Label 
        Content="{Binding Path=SelectedItem.ItemName}"/>

我可以在组合框中设置一个项目,但是当我在可观察集合中来回移动到当前项目时,组合框没有像我预期的那样设置SelectedValue(它仍然为空)-标签的内容设置正确-并且绑定到同一个对象

我做错了什么

非常感谢您的帮助


Joe

尝试使用我在这里描述的
ICollectionView
)。 CollectionView管理您的组合框,您可以读取和设置当前项。 只需从ICollectionView将事件处理程序附加到
CurrentChanged
事件

XAML:


视图模型:

public class ViewModel :INotifyPropertyChanged
{
    private ObservableCollection<Item> _items= new ObservableCollection<Item>();
    private Item _currentItem;

    public ObservableCollection<Item> Items
    {
        get { return _items; }
        set { _items= value; OnPropertyChanged("Items");}
    }

    public Item CurrentItem
    {
        get { return _currentItem; }
        set { _currentItem = value; OnPropertyChanged("CurrentItem");}
    }

    public ICollectionView ItemsView { get; private set; }

    public ViewModel()
    {
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 1"});
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 2"});
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 3"});

        ItemsView = CollectionViewSource.GetDefaultView(Items);
        ItemsView .CurrentChanged += OnItemsChanged;
        ItemsView .MoveCurrentToFirst();
    }

    private void OnItemsChanged(object sender, EventArgs e)
    {
        var selectedItem = ItemsView .CurrentItem as Item;
        if (selectedItem == null) return;

        CurrentItem= selectedItem ;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Item
{
    public Guid Id { get; set; }

    public string Name { get; set; }
}
公共类视图模型:INotifyPropertyChanged
{
私有ObservableCollection_items=新ObservableCollection();
私人物品_currentItem;
公共可观测收集项目
{
获取{return\u items;}
设置{u items=value;OnPropertyChanged(“items”);}
}
公共项目当前项目
{
获取{return\u currentItem;}
设置{u currentItem=value;OnPropertyChanged(“currentItem”);}
}
公共ICollectionView项目视图{get;private set;}
公共视图模型()
{
Items.Add(新项{Id=Guid.NewGuid(),Name=“Item 1”});
Items.Add(新项{Id=Guid.NewGuid(),Name=“Item 2”});
Items.Add(新项{Id=Guid.NewGuid(),Name=“Item 3”});
ItemsView=CollectionViewSource.GetDefaultView(项目);
ItemsView.CurrentChanged+=OnItemsChanged;
ItemsView.MoveCurrentToFirst();
}
私有void已更改(对象发送方,事件参数e)
{
var selectedItem=ItemsView.CurrentItem作为项目;
如果(selectedItem==null)返回;
CurrentItem=selectedItem;
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类项目
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
}
public class ViewModel :INotifyPropertyChanged
{
    private ObservableCollection<Item> _items= new ObservableCollection<Item>();
    private Item _currentItem;

    public ObservableCollection<Item> Items
    {
        get { return _items; }
        set { _items= value; OnPropertyChanged("Items");}
    }

    public Item CurrentItem
    {
        get { return _currentItem; }
        set { _currentItem = value; OnPropertyChanged("CurrentItem");}
    }

    public ICollectionView ItemsView { get; private set; }

    public ViewModel()
    {
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 1"});
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 2"});
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 3"});

        ItemsView = CollectionViewSource.GetDefaultView(Items);
        ItemsView .CurrentChanged += OnItemsChanged;
        ItemsView .MoveCurrentToFirst();
    }

    private void OnItemsChanged(object sender, EventArgs e)
    {
        var selectedItem = ItemsView .CurrentItem as Item;
        if (selectedItem == null) return;

        CurrentItem= selectedItem ;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Item
{
    public Guid Id { get; set; }

    public string Name { get; set; }
}