我在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);
答案 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"/>