如何绑定到与已指定的ItemsSource不同的ListBox内的源

时间:2015-05-13 21:36:43

标签: c# xaml combobox listbox

我在HubSection中有一个ListBox,其Items绑定到一个类" player"通过后面的代码添加到我的DefaulViewModel。 首先,我简单地将TextBox绑定到属性" PlayerName"我的班级"球员"。 现在我想添加一个ComboBox,其中包含一些不属于类玩家的项目。

有可能吗?我认为definind ComboBox中的ItemsSource会覆盖ListBox的ItemsSource,但不会显示任何内容。

整个页面的DataContext定义如下:

DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"

然后HubSection就是这样:

<HubSection x:Name="HubSec1">
        <DataTemplate>                    
            <ListBox x:Name="ListBox1" ItemsSource="{Binding players}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                       <StackPanel>
                            <TextBox Text="{Binding Path=PlayerName, Mode=TwoWay}"/>
                            <ComboBox ItemsSource="{Binding Path=ListOfElements}"/>                                                                                                                                                             
                        </StackPanel>
                     </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </DataTemplate>
</HubSection>

如果我以相同的方式定义ComboBox但在ListBox之外,它将显示&#34; ListOfElements&#34;的字符串元素。正常。 但在此ListBox中,ComboBox为空。所以我的猜测是,为ListBox定义了一个ItemsSource,无法覆盖它。

我试图定义一个DataTemplate但是没有成功这样做,但它可能是一个很好的解决方案(我没有正确地进行)

我错过了什么?

编辑: ComboBox项是一个ObservableCollection。它不属于&#34;玩家&#34;类。 以下是我将这些元素添加到DefaultViewModel

的方法
 DefaultViewModel.Add("players", players);
 DefaultViewModel.Add("MyItemsList", ListOfElements);

2 个答案:

答案 0 :(得分:1)

您可以沿着可视树向上走,并绑定到祖先的datacontext:

{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

EX:

{Binding Path=ListOfItems, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}

应该为您提供列表框所具有的datacontext,因此假设您的ListOfItems存在于该数据上下文中。

或者您可以为控件命名,然后按元素名称绑定到其datacontext:

{Binding ElementName=mySourceElement,Path=ListOfItems}

答案 1 :(得分:-1)

在Windows Apps中创建良好的工作绑定可能有点棘手。一个广泛使用的工作是使用Tag属性。

<ListBox x:Name="ListBox1" ItemsSource="{Binding players}" Margin="0,184,0,0" Tag="{Binding Path=ListOfElements}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBox Text="{Binding Path=PlayerName, Mode=TwoWay}"/>
                <TextBox Text="{Binding Path=Tag, ElementName=ListBox1}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

与特定名称的元素绑定始终有效。 ListOfElements应该在ListBox的范围内,因此您可以使用Tag属性作为代理。如果需要绑定多个属性,还可以使用虚拟XAML元素:

<Border Tag="{Binding ...}" Name="dummy1"/>