petko_stankoski
petko_stankoski

Reputation: 10713

Binding to a variable in view-model

This is my XAML code:

<ItemsControl  MinHeight="400" BorderThickness="0" ItemsSource="{Binding People}" ItemTemplateSelector="{StaticResource myItemsTemplateSelector}" />

And in the resources:

<UserControl.Resources>

    <DataTemplate x:Key="ItemTemplate">
            <Button CommandParameter="{Binding}" Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.SelectSomething}" >
                <StackPanel>
                        <TextBlock Text="{Binding Cars[0].Name}"></TextBlock>
                        <TextBlock Text="{Binding Cars[0].Description}"></TextBlock>
                </StackPanel>
            </Button>
    </DataTemplate>

    <selectors:MySelector ItemTemplate="{StaticResource ItemTemplate}" x:Key="myItemsTemplateSelector" />

</UserControl.Resources>

People is an ObservableCollection in my view-model. Person is a class which has this property:

public IList<Cars> Cars { get; set; }

As you can see, I bind the textblocks to Cars[0].Name and Cars[0].Description. The problem I have is the 0. Instead of 0 it needs to be a variable which is defined in my view-model. How can I make the binding to be something like this:

<TextBlock Text="{Binding Cars[variableInVM].Name}"></TextBlock>

Upvotes: 1

Views: 449

Answers (2)

petko_stankoski
petko_stankoski

Reputation: 10713

I fixed this issue by creating a new class which has these properties: Person, Cars and CurrentCars. Then, instead of binding with Cars[index], I bind with CurrentCars.

Upvotes: 1

Louis Kottmann
Louis Kottmann

Reputation: 16628

You could use an IMultiBindingConverter, and then use a MultiBinding that binds Cars and variableInVM and uses your converter.

The converter simply returns the variableInVM's element of Cars.

Inside that element, you would have the DataTemplate shown in your question, and it would use the Car passed in.

Upvotes: 0

Related Questions