WPF ListView数据绑定到ObservableCollection

时间:2010-01-03 23:15:35

标签: wpf data-binding listview observablecollection

在WPF应用中,我有ListView

<ListView Height="100" Width="434" x:Name="lvItems" ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection}" >
 <ListView.View>
  <GridView>
   <GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Date}"/>
   <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}"/>
   <GridViewColumn Header="Description" Width="200" DisplayMemberBinding="{Binding Description}"/>
  </GridView>
 </ListView.View>

通过数据绑定与ObservableCollection连接:

ObservableCollection<ShowsQu> _ShowQuCollection =
    new ObservableCollection<ShowsQu>();

public ObservableCollection<ShowsQu> ShowQuCollection
{ get { return _ShowQuCollection; } }

public class ShowsQu
{
public string ShowCode { get; set; }
public DateTime Date { get; set; }
public TimeSpan Time { get; set; }
public string Description { get; set; }
}

ObservableCollection位于同一窗口的代码隐藏文件中,其中ListViewMainWindow。一切正常。

现在我将另一个ListView添加到不同的窗口,在这种情况下,数据绑定不起作用。这个数据绑定的XAML I没有改变:

ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection}

如何更新此ListView数据绑定声明(ListView中的SecondWindow),使其与ObservableCollection中的MainWindow相关联?

2 个答案:

答案 0 :(得分:4)

ElementName绑定仅在当前窗口中查找。您需要将Binding Source或(更可能)本地DataContext显式设置为该其他窗口。

但是,更好的方法是从Window类中删除ShowQuCollection并使其成为单独的“视图模型”类(非可视,仅数据)的一部分。然后,您可以使两个Windows具有相同的DataContext(视图模型类的实例),您根本不需要使用ElementName绑定。 ElementName绑定通常在某些内容依赖于UI中的另一个控件时使用(例如,将Panel的Visibility绑定到CheckBox的IsChecked),而不是作为引用实际数据的方式。

答案 1 :(得分:0)

如果通过“不同窗口”表示不同的类,则需要将第二个窗口的DataContext设置为与第一个窗口的datacontext相同。