Wpf 主从列表视图绑定

Posted

技术标签:

【中文标题】Wpf 主从列表视图绑定【英文标题】:Wpf master detail listview binding 【发布时间】:2014-04-02 13:25:14 【问题描述】:

我有一个这个模型(它不是实际代码,为了清楚起见,我省略了 INotifyPropertyChanged 实现)。

  public class Project
  
       public ObservableCollection<Component> Components  get; set; 
  

  public class Component
  
       public ObservableCollection<Item> Items  get; set; 
  

  public class Item 
  
       public LookupItem LookupItem  get; set; 
  

这是 ViewModel

  public class ViewModel
  
        public Project Project  get; set; 
        public Components  get  return Project.Components;  

        public ObservableCollection<LookupItem> LookupItems  get; set; 
  

在视图中,我有两个列表视图,一个显示组件,另一个绑定到第一个显示所选组件的项目。后一个列表视图应该有一个用于任何项目的组合框以更改查找项,但我无法绑定它。

这是xaml

   <ListView x:Name="list" ItemsSource="Binding Components">
       ......
   </LIstView>

后者

  <ListView  ItemsSource="Binding Items" DataContext="Binding SelectedItem, ElementName=list">
....
<GridViewColumn Width="140">
    <GridViewColumnHeader Tag="Publisher" Content="Item" />
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">
                <ComboBox SelectedItem="Binding Path=Item" ItemsSource="Binding RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type local:ViewModel, Path=LookupItems, Mode=TwoWay " DisplayMemberPath="Name" />
            </Grid>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我无法填充组合框。 Wpf 给了我错误

  System.Windows.Data Error: 4 : Cannot find source for binding with 
  reference 'RelativeSource FindAncestor, AncestorType='Projectname.ViewModels.ViewModel', AncestorLevel='1''. BindingExpression:Path=LookupItems; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

【问题讨论】:

【参考方案1】:

尝试将您的 ViewModel 添加为 DataContext,例如。对于Window,像这样:

<Window.DataContext>
    <local:ViewModel />
</Window.DataContext>

或在代码隐藏中:

var viewModel = new ViewModel();
this.DataContext = viewModel;

在 DataTemplate 中这样写:

<DataTemplate>
    <Grid HorizontalAlignment="Stretch">
        <ComboBox ItemsSource="Binding Path=DataContext.LookupItems, 
                                        RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type Window,
                                        Mode=TwoWay" ... />
    </Grid>
</DataTemplate>

【讨论】:

以上是关于Wpf 主从列表视图绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何将控件绑定到 WPF 列表视图列

选定的 WPF 列表框绑定仅更新视图中的项目

WPF 自定义用户控件绑定在列表视图中始终返回 false

如何在 WPF / MVVM 中对绑定到相同实例的两个列表视图进行不同选择

列表视图中的文本块不显示绑定数据 - WPF XAML

wpf树视图绑定[关闭]