eran otzap
eran otzap

Reputation: 12533

Binding to a property of the DataContext of another control

iv'e got 2 panels in an app game

they are both bound to different elements .

    GameDetailsPanel.DataContext = game ;

    GameBoardPanel.DataContext = gameBoard ;

*Game has a Turn Property * .

    public Class Game 
    {
        public bool Turn{ get; set;}             
    } 

now i need to bind one of GameBoardPanel to the value of the Property Turn ,

*for example : something along the lines of *

   <Button Fill={Binding Source=GameDetailsPanel.DataContext , Path=Turn } ></Button>

how can i reference GameDetailsPanel.DataContext in my binding ?

Upvotes: 11

Views: 19272

Answers (3)

Kylo Ren
Kylo Ren

Reputation: 8823

use simply

<Button Fill="{Binding ElementName=GameDetailsPanel,Path=DataContext.Turn}"></Button>

this element binding.

Upvotes: 3

JJJCoder
JJJCoder

Reputation: 16986

For the benefit of searchers, you can bind to the datacontext of another control as detailed here.

The quick solution in my case looked like:

<TextBlock Text="{Binding ElementName=ucClientDetails, 
                          Path=DataContext.FullName}"></TextBlock>

where 'ucClientDetails' was a user control bound to a viewmodel containing client details (including FullName).

Upvotes: 22

KodeKreachor
KodeKreachor

Reputation: 8882

I would recommend having your game and gameBoard properties on a wrapper view model and then setting the datacontext of your view to the wrapper view model. That way in your button's Fill binding you could simply reference the appropriate property on your view model:

public Class Wrapper_ViewModel
{
    public Game game{ get; set; } 
    public T gameBoard{ get; set; }           
}

<Button Fill={Binding Path=game.Turn} ></Button>

However, for more one-off scenarios you could use the relative source binding attribute and hook another elements data context, as in this example: Access parent DataContext from DataTemplate

Upvotes: 5

Related Questions