2014-03-01 132 views
3

我有一個這個模型(它不是實際的代碼,我爲了清晰起見省略了INotifyPropertyChanged實現)。Wpf主詳細列表視圖綁定

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; } 
    } 

在視圖我有兩個列表視圖一個示出的組件和其它綁定到表示selecte元器件的物品的第一個。後者的listview應該有任何Item的組合框來改變lookupitem,但是我不能綁定它。

這是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') 

回答

3

嘗試添加您的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> 
+1

哇!好的一個,它的工作原理!你節省了我的一天;) –