如何保持列表视图的选定项目WPF绑定

时间:2017-05-30 16:56:17

标签: wpf listview mvvm

我有一个每5秒更新一次的功能。我想保留所选项目,但该项目未被选中。

以下功能每5秒更新一次并更新列表视图中的列表:

C#

public void festJSONUpdateEventHandler()
{
     var tempfest = Workspace.This.festStats.Selectedfest;

     //REFRESH BINDINGS HERE!!
     Workspace.This.festStats.festItems  = MainWindow._fest.festData.fest_Items;

     Workspace.This.festStats.Selectedfest = tempfest;

}  

XAML

 <DataTemplate>
        <StackPanel Orientation="Vertical">
            <ListView x:Name="lvfest"  ItemsSource="{Binding festItems}" SelectedItem="{Binding Selectedfest, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="100" DisplayMemberBinding="{Binding id}" >
                            <GridViewColumn.Header>
                                <GridViewColumnHeader Tag="ID" Click="lvfestColumnHeader_Click">ID</GridViewColumnHeader>
                            </GridViewColumn.Header>
                        </GridViewColumn>
                        <GridViewColumn  Width="100" DisplayMemberBinding="{Binding formatType}" >
                            <GridViewColumn.Header>
                                <GridViewColumnHeader Tag="Format" Click="lvfestColumnHeader_Click">Format</GridViewColumnHeader>
                            </GridViewColumn.Header>
                        </GridViewColumn>
                        <GridViewColumn Width="100" DisplayMemberBinding="{Binding modifiedIso8601}" >
                            <GridViewColumn.Header>
                                <GridViewColumnHeader Tag="Date" Click="lvfestColumnHeader_Click">Date</GridViewColumnHeader>
                            </GridViewColumn.Header>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
        </StackPanel>
</DataTemplate>

更多C#

class festViewModel : ToolViewModel
{
    public festItem _selectedfest;
    public festItem Selectedfest
    {
        get { return _selectedfest; }
        set
        {
            if (_selectedfest != value)
            {
                _selectedfest = value;
                RaisePropertyChanged("Selectedfest");
            }
        }
    }

    private List<festItem> _festItems;
    public List<festItem> festItems
    {
        get { return _festItems; }
        set
        {
            if (_festItems != value)
            {
                _festItems = value;
                RaisePropertyChanged("festItems");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

来自评论:

  

我有一个提取JSON数据的库,在那里有一个列表   称为fest_Items的对象。从这个列表中,我发送对象   festItems列在festViewModel中,它绑定到我的列表视图。

是否在每个函数调用(ergo 5秒)重新创建列表?可能是因为您的商品不包含与对象相同的引用

共享相同值的两个或多个对象可能不是相同的引用。如果要重新创建列表,则可能是绑定无法检索项目的原因。

作为解决方案,我建议找到一个唯一的属性(比如模型的ID属性)并在新创建的列表中搜索该项。

例:

public void festJSONUpdateEventHandler()
{
    var tempfestID = Workspace.This.festStats.Selectedfest.ID;

    //REFRESH BINDINGS HERE!!
    Workspace.This.festStats.festItems  = MainWindow._fest.festData.fest_Items;

    // Find the first festStat that has the same ID as the old selected one.
    Workspace.This.festStats.Selectedfest = Workspace.This.festStats.FirstOrDefault(x => x.ID == tempfestID);
}

如果它不起作用,请告诉我。