2

In my SilverLight application, I have a property in my ViewModel called 'vmProperty' and a list called 'dgSource'.

I bind my dgSource to the datagrid as ItemsSource at which point each datagrid row's datacontext changes to each item in dgSource. One of the columns, say a checkbox column, needs to bind to vmProperty. But since the ViewModel is no longer the row's datacontext, I cannot get access to this property.

How do I get around this problem? If the question is not clear, please let me know and I will post a sample. Thanks in advance.

1
  • Do really intend for each checkbox instance for each row to bind back to the same property on the parent object, doesn't seem to make a lot of sense to me? Commented Dec 1, 2009 at 12:11

2 Answers 2

0

Assuming your ViewModel is assigned as the LayoutRoot's DataContext this should work:-

IsChecked="{Binding DataContext.vmProperty, ElementName=LayoutRoot}"

Of course this doesn't work, ultimately a template is replicated and therefore "LayoutRoot" does not exist in the namescope where the binding is actually used.

The simplest solution since this is a ViewModel is to change the model. Expose the required value on the objects available in the dgSource or expose a Parent property that navigates back to the ViewModel.

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for your responses. I used the ElementName method you have mentioned. But I run into the same issue as in 'stackoverflow.com/questions/1089650/…'. I put this outside the datagrid and this piece code works great. But within the datagrid it doesnt. Anyways, I used the link provided in that thread 'blogs.msdn.com/jaimer/archive/2008/11/22/…', but that seems to be relevant only for WPF. I am unable to access AddOwner or OverrideMetadata. Thoughts?
Thanks Anthony, Managed to expose it as part of dgSource. Not happy about it as it is replication. But it is working. So... :)
Thats the advantage of a view model. It would be most unsatisfactory if it were simply the model but the whole point of a view model is that its munged form of data that supports a specific view or task.
0

Try to set checked property of your chechbox column to that:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourViewClassName}}, Path=DataContext.vmProperty}

That's mean that parent element which type is your view type will be found and than vmProperty of it's DataContext will be retrieved as value.

UPDATE:

It was solution for WPF.

For silverlight I think you can try to use construction like this:

{Binding Path=DataContext.vmProperty, ElementName=YourElement}

Where DataContext of YourElement is instance of your view model. I think it can be a grid for example.

<Grid x:Name="YourElement" DataContext={Binding}>
<!-- DataGrid here -->
</Grid>

2 Comments

I think that is WPF, isnt it? SilverLight does not have RelativeSource or AncestorType, I believe.
It has RelativeSource but only in very limited capacity

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.