DataContext ComboBox绑定在ListBox内部

时间:2017-01-20 18:12:21

标签: c# xaml data-binding windows-phone-8.1

我有一个ListBox,显示List<Item> Items,其中Item是自定义对象。 Foreach项目我希望用户看到ComboBox List<string> Options作为来源,所选项目将追回到项目上的属性。在列表框中,我可以轻松地绑定单个Item属性,但是如何返回到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只建议将范围限定在ListBox内... 不要信任可视工作室

我只是这样做错了吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

您可以在Combobox绑定对象上使用RelativeSource属性来查找父级。这样的事情应该有效

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

如果您正在使用页面或窗口,请将UserControl替换为Page。