olidev
olidev

Reputation: 20684

Binding an item inside DataTemplate

In my xaml file, I have:

<DataTemplate DataType="{x:Type Configuration:Drivers}">
    <ItemsControl ItemsSource="{Binding Cars}" FontWeight="Normal" />   
<DataTemplate>

<DataTemplate DataType="{x:Type Configuration:Car}">
    <UniformGrid HorizontalAlignment="Stretch" Margin="5,1,5,2" Columns="2">                                              
         <CheckBox IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>    
         <CheckBox Visibility="{Binding SaveImage, UpdateSourceTrigger=PropertyChanged}"/>
    </UniformGrid>      
</DataTemplate>   

For each car, it has: Enabled property but does not have SaveImage property.

Car
{
   public bool Enabled {}
}

The 'SaveImage' is set in globally. I don't know how to bind that: bool SaveImage inside the DataTemplate?

Upvotes: 1

Views: 1110

Answers (3)

Dean Chalk
Dean Chalk

Reputation: 20471

DataTemplates are an encapsulation boundary, so you cannot allways use FindAncestor to get the desired data. A good solution is to put your ViewModel in your XAML as a StaticResource and then set the DataContext of you LayoutRoot grid to this StaticResource, then all other DataTemplates can access the DataContext via the same StaticResource

EXAMPLE

<Window.Resources>
    <local:MyViewModel x:Key="viewmodel" />
    <DataTemplate DataType="{x:Type Configuration:Car}">
        <UniformGrid HorizontalAlignment="Stretch" Margin="5,1,5,2" Columns="2">
            <CheckBox IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>
            <CheckBox Visibility="{Binding Source={StaticResource viewmodel}, 
                Path=SaveImage, UpdateSourceTrigger=PropertyChanged}"/>
        </UniformGrid>
    </DataTemplate>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource viewmodel}}">

</Grid>

Upvotes: 2

SemiHum
SemiHum

Reputation: 1

Solution 1: You can try RelativeSource to Bind IsCheck to the abcestor object.

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

Solution 2: Add a property SaveImage to view-model class Car and ref to model SaveImage.It's not a good solution.

Upvotes: 0

MatthiasG
MatthiasG

Reputation: 4532

If SaveImage is available in the DataContext of the ItemsControl you can bind to it this way:

<CheckBox IsChecked="{Binding DataContext.SaveImage, UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"/>

Upvotes: 0

Related Questions