How to bind to a source inside a ListBox different from the ItemsSource already specified

可紊 提交于 2019-12-02 08:08:58

问题


I have a ListBox inside a HubSection, whose Items are bound to a class "players" added to my DefaulViewModel via code behind. First I simply put a TextBox bound to the property "PlayerName" of my class "players". Now I would like to add a ComboBox with some items that are NOT part of the class players.

Is it possible ? I thought that definind an ItemsSource in the ComboBox would sort of override the ItemsSource of the ListBox, but nothing displays.

The DataContext of the whole page is defined like so:

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

Then the HubSection is like so:

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

If I define the ComboBox in the same way but outside the ListBox, it will display the string elements of "ListOfElements" properly. But in this ListBox, the ComboBox is empty. So my guess is that having defined an ItemsSource for the ListBox, it is not possible to override it.

I have tried to define a DataTemplate but was not successful doing so, but it might be the good solution (and I did not proceed properly)

What am I missing ?

Edit : The ComboBox items is an ObservableCollection. It is not part of the "players" class. Here is how I added these elements to the DefaultViewModel

 DefaultViewModel.Add("players", players);
 DefaultViewModel.Add("MyItemsList", ListOfElements);

回答1:


You can walk up the visual tree and bind to an ancestors datacontext:

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

EX:

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

that should give you the datacontext that the listbox has, so assuming your ListOfItems exists in that data context.

Or you can name your control, and then bind to its datacontext by element name:

{Binding ElementName=mySourceElement,Path=ListOfItems}


来源:https://stackoverflow.com/questions/30225600/how-to-bind-to-a-source-inside-a-listbox-different-from-the-itemssource-already

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!