2017-01-20 59 views
0

我有一個ListBox顯示一個List<Item> Items與項目是一個自定義對象。每個項目我希望用戶看到一個ComboBoxList<string> Options作爲來源與所選項目綁定回項目屬性。在列表框中,我沒有綁定單個Item屬性的麻煩,但是如何返回DataContext以獲取我的選項列表?DataContext組合框在列表框中的綁定

視圖模型被設置爲頁面的DataContext的

class ViewModel 
{ 
     public ObservableCollection<string> Options { get; set; } 
     public ObservableCollection<Item> Items { get; set; } 
} 

的XAML

<ListBox x:Name="ItemsListBox" ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid Height="50" > 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 
       <TextBlock x:Name="ItemProperty1TB" 
        Text="{Binding Path=Property1, Mode=OneWay}" 
        Grid.Column="0" 
       /> 
       <ComboBox x:Name="OptionsCB" 
        SelectedItem ="{Binding ChosenOptions, Mode=TwoWay}" 
        ItemsSource="{Binding Path=DataContext.Options}"   
        Grid.Column="1" 
        PlaceholderText="Option" 
       /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我試着切出儘可能多的額外的代碼,並得到一個可讀的例子。

How to bind to a source inside a ListBox different from the ItemsSource already specified這使用不存在的AncestorType?

ComboBox inside Listbox.ItemTemplate Binding problem這綁定到一個靜態資源。我應該將選項放入靜態資源嗎?

ElementName看起來很有希望,但我只有IDE建議元素作用域列表框裏面...... 不要相信的Visual Studio

我是不是要對此都錯了?

+0

視圖模型需要有屬性,而不是字段。這是實際的代碼? –

+0

沒有那不是實際的代碼我會快速改變 – JaredStroeb

+1

嘗試'ItemsSource =「{綁定路徑= DataContext.Options,ElementName = ItemsListBox}」' –

回答

0

試試這個:

ItemsSource="{Binding Path=DataContext.Options, ElementName=ItemsListBox}" 
0

您可以在Combobox綁定對象上使用RelativeSource屬性來查找父級。像這樣的東西應該工作

ItemsSource="{Binding Path=DataContext.Options, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 

用頁面替換UserControl,如果您正在使用頁面或窗口的事情。

+0

該方法似乎在WPF中工作,但不在Windows Phone中。 – JaredStroeb

+0

好吧我不確定關於Windows Phone,但是你可以在父母上使用ElementName,如果它在wp中有效。 –