(New user of xamDataGrid 8.1)
My ultimate goal is to be able to perform my logic in my viewmodel class.
I am binding the grid to an XmlDataProvider, and currently I've got it to work sort of by hooking the SelectedItemsChanging event and adding a dummy xml attribute to the bound data indicating if it is selected or not. While seems to work it feels like a hack.
Would it possible to directly bind the IsSelected of a datarecord to an xml attribute?
Is there a better way to make the viewmodel aware of currently selected items/records without taking a reference to the grid?
Hello,
@ sdahlbac : Would it possible to directly bind the IsSelected of a datarecord to an xml attribute?
You can get the attribute of the xml node with XPath and then manipulate it and bind it to the IsSelected property. Here are examples of XPath syntax :
http://www.w3schools.com/XPath/xpath_syntax.asp
Do you have an example of how to bind to the IsSelected property of a DataRecord? The xml nomenclature isn't the issue.
Hopefully you already found your answer, but if anyone else is looking (like I was):
<igDP:XamDataGrid.Resources>
<Style TargetType="{x:Type igDP:DataRecordPresenter}">
<Setter Property="IsSelected" Value="{Binding DataItem.IsSelected, Mode=TwoWay}"/>
</Style>
</igDP:XamDataGrid.Resources>
Great, just what I was looking for.
Unfortunately, by adding this it's also "overwriting" the theme style for the DataRecordPresenter. Is there anyone who knows how to keep the original settings and just adding the IsSelected binding ?
I was thinking using the "BasedOn" maybe, but how can I find the name of the style that it should be BasedOn?
You can put that style inside the Resource of the XamDataGrid so that this style can take precendece over the theme. You can also set the based on property on that theme's style like this:
<Style TargetType="{x:Type igDP:DataRecordPresenter}" BasedOn="{x:Static Themes:DataPresenterOnyx. igDP:DataRecordPresenter}">
Let me know if you still have problems with that.
Hi!
Unfortunataly your solution doesn't work for me.If I bind my CollectionViewModel "PersonList" to the DataGrid DataSource I receive a BindingExpression Error after I active another record.
BindingExpression path error: 'DataItem' property not found on 'object' ''PersonList'.
It seems that the DataContext of the DataPresenter is not the selected ViewModel but rather the bound CollectionViewModel "PersonList". Therefore DateItem.IsSelected can not be found.
Have I done something wrong? Here is the Xaml im using:
<Grid.DataContext> <local:PersonList /> </Grid.DataContext> <igDP:XamDataGrid Theme="Office2k7Black" Grid.Row="1" DataSource="{Binding Path=Persons}"> <igDP:XamDataGrid.Resources> <Style TargetType="{x:Type igDP:DataRecordPresenter}"> <Setter Property="IsSelected" Value="{Binding DataItem.IsSelected, Mode=TwoWay}"/> </Style> </igDP:XamDataGrid.Resources> <igDP:XamDataGrid.FieldLayoutSettings> <igDP:FieldLayoutSettings SelectionTypeField="Range" SelectionTypeRecord="Range"/> </igDP:XamDataGrid.FieldLayoutSettings> </igDP:XamDataGrid>
Hi Dominik,
We have had a lot of problems with the xamDataGrid when binding directly to an ObservableCollection. Our solution is to expose its ListCollectionView instead and bind to that.
I would be interested to know if that solves your problem!
Dayne
Hi dembrats!My Object Structure (simplified) looks as follows: public class PersonListViewModel { public ObservableCollection<Person> Persons { get; set; } public PersonListViewModel() { Persons = new ObservableCollection<Person>() { new Person(){Name = "Homer"}, new Person(){Name = "Marge"}, new Person(){Name = "Bart"}, new Person(){Name = "Lista"}, new Person(){Name = "Maggie"}, }; } } public class Person : INotifyPropertyChanged { public bool IsSelected { get; set; } public string Name { get; set; } } If I use the following XAML I get the BindingExpression Error: System.Windows.Data Error: 39 : BindingExpression path error: 'DataItem' property not found on 'object' ''PersonListViewModel' (HashCode=45523402)'. BindingExpression:Path=DataItem.IsSelected; DataItem='PersonListViewModel' (HashCode=45523402); target element is 'DataRecordPresenter' (Name=''); target property is 'IsSelected' (type 'Boolean')
XAML: <Window x:Class="WpfApplication4.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:l="clr-namespace:WpfApplication4" xmlns:igDP="http://infragistics.com/DataPresenter"> <Window.DataContext> <l:PersonListViewModel /> </Window.DataContext> <Grid> <igDP:XamDataGrid Name="xamDataGrid1" DataSource="{Binding Persons}"> <igDP:XamDataGrid.Resources> <Style TargetType="{x:Type igDP:DataRecordPresenter}"> <Setter Property="IsSelected" Value="{Binding DataItem.IsSelected, Mode=TwoWay}"/> </Style> </igDP:XamDataGrid.Resources> <igDP:XamDataGrid.FieldLayouts> <igDP:FieldLayout> <igDP:FieldLayout.Fields> <igDP:Field Name="Name" Label="Name"/> <igDP:Field Name="IsSelected" Label="IsSelected" /> </igDP:FieldLayout.Fields> </igDP:FieldLayout> </igDP:XamDataGrid.FieldLayouts> </igDP:XamDataGrid> </Grid></Window>Although the IsSelected Property is set correctly by now, I have experienced a negative performance impact when loading a large list of objects. Especially when scrolling via scrollbar, there are a lot of the following Binding Errors:System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Infragistics.Windows.DataPresenter.DataRecordCellArea', AncestorLevel='1''. BindingExpression:Path=IsSelected; DataItem=null; target element is 'CellValuePresenter' (Name=''); target property is 'NoTarget' (type 'Object')Is there a way to avoid these binding errors?Best regards,Dominik
Got it - I forgot fireing the propertychange event in the bound object. Sorry x)
Your XamDataGrid.DataSource is bound to the Persons property. What type is that?
I am not sure why this code snippet would not be working.
Do you have an IsSelected property of the underlying business object ?