当移回集合中的项目时,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; }
}