NatanC
NatanC

Reputation: 71

WPF Data Binding ViewModel property to ListBox inside a User Control in code behind

I'm trying to bind dynamically, in code behind, a VM property (an obseravble collection) to image in listBox that sits inside a usercontrol I show on my window, but it's not working.

This is the XAML of the user control:

<WrapPanel x:Name="panel" HorizontalAlignment="Center" Focusable="False" FocusManager.IsFocusScope="False">
    <ListBox x:Name="MazeListBox" ItemsSource="{Binding}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid x:Name="MazeUniformGrid" Columns="{Binding VM_MazeCols}" Rows="{Binding VM_MazeRows}"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Image x:Name="Img" Margin="-6" Source="{Binding}" Focusable="False"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</WrapPanel>

This are the usercontrols in XAML of the Outer Window:

    <Controls:MazeBoard1  x:Name="you" Margin="0,0,650,0" Grid.Column="0" Height="Auto" Width="Auto" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <Controls:MazeBoard1 x:Name="other" Margin="650,0,0,0" Grid.Column="0" Height="Auto" Width="Auto" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center"/>

This is how I bind dynamically in the cs of the window:

            Binding youBinding = new Binding
        {
            Path = new PropertyPath("VM_MazeDisplay"),
        };

        Binding otherBinding = new Binding
        {
            Path = new PropertyPath("VM_OtherMazeDisplay"),
        };
        you.MazeListBox.SetBinding( ContentControl.ContentProperty,youBinding);
        other.MazeListBox.SetBinding(ContentControl.ContentProperty, otherBinding);

I'll appreciate your help. Thank you

Upvotes: 0

Views: 194

Answers (1)

Amaury Lev&#233;
Amaury Lev&#233;

Reputation: 1512

Everything looks weird on your XAML...but if you do the following: you.MazeListBox.SetBinding(ListBox.DataContextProperty, youBinding) or you.SetBinding(UserControl.DataContextProperty, youBinding) or even you.MazeListBox.SetBinding(ListBox.ItemsSourceProperty, youBinding) (you will have to remove the binding into your xaml).

You should have the expected results.

However, why doing a binding in this point and not just only setting the DataContext? Something like you.DataContext = VM_MazeDisplay (assuming the instance of the VM is called that way).

Also, why do you put your ListBox into a WrapPanel?

Upvotes: 1

Related Questions