如何使用mvvm在viewmodel中刷新后从listview获取最后一个SelectedItem索引?

时间:2017-11-23 18:48:27

标签: c# wpf listview mvvm

我无法在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

1 个答案:

答案 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。)