我无法在viewmodel中访问listview的selecteditem,并将其绑定到我的CurrentProduct。我应该如何在viewmodel中编写代码,这样我才能得到CurrentProduct(selecteditem)的索引,所以我刷新listview后我可以恢复值
XAML
<ListView Name="sItem" BorderThickness="0.4" BorderBrush="DarkGray" Grid.Row="1" Grid.Column="1" ItemsSource="{Binding ProductList}" SelectedItem="{Binding CurrentProduct}"/>
VIEWMODEL - 这就是我刷新listview的方式
ProductList = ProductCollection.GetAllProducts();
我的viewmodel实现了INotifyPropertyChanged
答案 0 :(得分:1)
您可以在ViewModel上实现一个属性,例如:
private Product _productListSelectedItem;
public Product ProductListSelectedItem
{
get { return _productListSelectedItem; }
set
{
if (_productListSelectedItem != value)
{
_productListSelectedItem = value;
NotifyPropertyChanged();
}
}
}
然后在你的XAML中绑定到这个:
<ListView Name="sItem" ... SelectedItem="{Binding ProductListSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
在刷新ListView
:
private void RefreshProductList()
{
Product selectedItem = ProductListSelectedItem;
ProductList = ProductCollection.GetAllProducts();
if (ProductList.FirstOrDefault(p => p.ID == selectedItem.ID) != null)
{
ProductListSelectedItem = ProductList.First(p => p.ID == selectedItem.ID);
}
}
一旦你刷新了ProductList
,你就会有一组新的项目,所以我在这里所做的就是在收集更改之前存储所选的项目,并且然后使用LINQ
表达式通过名为ID
的属性在新集合中找到该项。我假设你有一个属性或一组属性来定位不同的项目,因为我认为你在这种情况下需要一个。
(我还假设您的个人姓名为Product
。)