2017-05-30 170 views
0

我有一个每5秒更新一次的函数。我想保留所选项目,但该项目未被选中。如何保持列表视图的选定项目WPF绑定

功能如下更新每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

那么,实际上是在MainWindow._fest.festData.fest_Items中分配给tempfest的对象吗?如果不是,那么显然你不能保留旧的选择... – elgonzo

+2

项目的集合必须绑定到ItemsSource,必须有SelectedItem绑定,并且必须在ItemsSource集合中找到SelectedItem *中项目的实例*。 – Will

+0

我有一个库提取JSON数据,并在那里有一个名为fest_Items的对象列表。从这个列表中,我将对象发送到绑定到我的列表视图的festViewModel中的festItems列表。这可能是因为对象中的数据发生了变化吗?例如时间戳? – Decoder94

回答

1

从评论:

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

是否在每个函数调用时重新创建列表(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); 
} 

让我知道,如果它不能正常工作。

相关问题