在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
位于同一窗口的代码隐藏文件中,其中ListView
为MainWindow
。一切正常。
现在我将另一个ListView
添加到不同的窗口,在这种情况下,数据绑定不起作用。这个数据绑定的XAML I没有改变:
ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection}
如何更新此ListView
数据绑定声明(ListView
中的SecondWindow
),使其与ObservableCollection
中的MainWindow
相关联?
答案 0 :(得分:4)
ElementName绑定仅在当前窗口中查找。您需要将Binding Source或(更可能)本地DataContext显式设置为该其他窗口。
但是,更好的方法是从Window类中删除ShowQuCollection并使其成为单独的“视图模型”类(非可视,仅数据)的一部分。然后,您可以使两个Windows具有相同的DataContext(视图模型类的实例),您根本不需要使用ElementName绑定。 ElementName绑定通常在某些内容依赖于UI中的另一个控件时使用(例如,将Panel的Visibility绑定到CheckBox的IsChecked),而不是作为引用实际数据的方式。
答案 1 :(得分:0)
如果通过“不同窗口”表示不同的类,则需要将第二个窗口的DataContext设置为与第一个窗口的datacontext相同。