Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

binding a command inside a listbox item to a property on the viewmodel parent

Tags:

I've been working on this for about an hour and looked at all related SO questions.

My problem is very simple:

I have HomePageVieModel:

HomePageVieModel +IList<NewsItem> AllNewsItems +ICommand OpenNews 

My markup:

<Window DataContext="{Binding HomePageViewModel../> <ListBox ItemsSource="{Binding Path=AllNewsItems}">  <ListBox.ItemTemplate>    <DataTemplate>        <StackPanel>         <TextBlock>            <Hyperlink Command="{Binding Path=OpenNews}">                <TextBlock Text="{Binding Path=NewsContent}" />            </Hyperlink>         </TextBlock>       </StackPanel>     </DataTemplate> </ListBox.ItemTemplate> 

The list shows fine with all the items, but for the life of me whatever I try for the Command won't work:

<Hyperlink Command="{Binding Path=OpenNewsItem, RelativeSource={RelativeSource AncestorType=vm:HomePageViewModel, AncestorLevel=1}}"> <Hyperlink Command="{Binding Path=OpenNewsItem, RelativeSource={RelativeSource AncestorType=vm:HomePageViewModel,**Mode=FindAncestor}**}"> <Hyperlink Command="{Binding Path=OpenNewsItem, RelativeSource={RelativeSource AncestorType=vm:HomePageViewModel,**Mode=TemplatedParent}**}"> 

I just always get :

System.Windows.Data Error: 4 : Cannot find source for binding with reference .....

Update I am setting my ViewModel like this? Didn't think this would matter:

 <Window.DataContext>         <Binding Path="HomePage" Source="{StaticResource Locator}"/>     </Window.DataContext> 

I use the ViewModelLocator class from the MVVMLight toolkit which does the magic.

like image 307
gideon Avatar asked Feb 21 '11 07:02

gideon


Video Answer


1 Answers

Slightly different example but, I found that by referencing the parent container (using ElementName) in the binding you can get to it's DataContext and its subsequent properties using the Path syntax. As shown below:

<ItemsControl x:Name="lstDevices" ItemsSource="{Binding DeviceMappings}">  <ItemsControl.ItemTemplate>   <DataTemplate>    <Grid>     <ComboBox Text="{Binding Device}" ItemsSource="{Binding ElementName=lstDevices, Path=DataContext.AvailableDevices}" />     ...    </Grid>   </DataTemplate>  </ItemsControl.ItemTemplate> </ItemsControl> 
like image 147
Darren Avatar answered Oct 08 '22 09:10

Darren