Hi there
I know I can easily bind *to* a grid's active item by setting a binding using the ActiveRecord.DataItem property. However, how can I do it the other way round? I don't see a converter as a solution: The converter does not have a context (the grid), and this context cannot be assigned through a binding property because that would lead to a circular reference (if I declare it first, the binding fails, if I declare it later, the grid does not see the converter):
<UserControl.Resources> <!-- this binding does not work - the grid has not been created yet --> <conv:ActiveGridRowConverter x:Key="rowConverter" Grid="{Binding ElementName=contactGrid, Mode=OneTime}" /></UserControl.Resources><igDP:XamDataGrid x:Name="contactGrid" DataSource="{Binding Path=ContactStore.Contacts}" ActiveRecord="{Binding Path=ActiveContact.Contact, Converter={StaticResource rowConverter}}" />
I'm not sure whether I'm just overlooking the obvious - what's the recommended solution here?
Thanks,
Philipp
Hi Joe
Your assumption is correct (I wanted to go that way because I don't see a simpler solution to setting the active record). However, ActiveContact is part of my view model and therefore unaware of grids or any other UI controls. Is it possible that the grid exposes somewhat of a design flaw here? ActiveRecord is a pretty "WinFormish" strategy and - as it appears - a one way street when it comes to binding objects. IMO, an ActiveItem property was the way to go...
Any idea for a workaround? I honestly can't imagine thatI'm the first person to set the active item through a binding expression
Cheers
Philpp
<local:DataItemToRecordConverter x:Key="myDataItemToRecordConverter"/>
<igDP:XamDataGrid Name="xamDataGrid1" >
<igDP:XamDataGrid.ActiveRecord> <MultiBinding Converter="{StaticResource myDataItemToRecordConverter}"> <Binding ElementName="xamDataGrid1"/> <Binding Path="ActiveContact.Contact"/> </MultiBinding> </igDP:XamDataGrid.ActiveRecord>
<igDP:XamDataGrid.ActiveRecord>
<MultiBinding Converter="{StaticResource myDataItemToRecordConverter}"> <Binding ElementName="xamDataGrid1"/> <Binding Path="ActiveContact.Contact"/> </MultiBinding>
<MultiBinding Converter="{StaticResource myDataItemToRecordConverter}">
<Binding ElementName="xamDataGrid1"/> <Binding Path="ActiveContact.Contact"/>
<Binding ElementName="xamDataGrid1"/>
<Binding Path="ActiveContact.Contact"/>
</MultiBinding>
</igDP:XamDataGrid.ActiveRecord>
</igDP:XamDataGrid>
public class DataItemToRecordConverter : IMultiValueConverter
{
public object Convert(object[ values, Type targetType, object parameter, CultureInfo culture) { DataPresenterBase dataPresenterBase = values[0] as DataPresenterBase; if (dataPresenterBase != null) { Contact contact = values[1] as Contact; if (contact != null) return dataPresenterBase.GetRecordFromDataItem(contact, true); } return null; } public object[ ConvertBack(object value, Type[ targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException("Convert Back not implemented"); }
public object Convert(object[ values, Type targetType, object parameter, CultureInfo culture)
DataPresenterBase dataPresenterBase = values[0] as DataPresenterBase; if (dataPresenterBase != null) { Contact contact = values[1] as Contact; if (contact != null) return dataPresenterBase.GetRecordFromDataItem(contact, true); } return null;
DataPresenterBase dataPresenterBase = values[0] as DataPresenterBase;
if (dataPresenterBase != null)
Contact contact = values[1] as Contact; if (contact != null) return dataPresenterBase.GetRecordFromDataItem(contact, true); }
Contact contact = values[1] as Contact;
if (contact != null)
return dataPresenterBase.GetRecordFromDataItem(contact, true);
}
return null;
public object[ ConvertBack(object value, Type[ targetTypes, object parameter, CultureInfo culture)
throw new NotImplementedException("Convert Back not implemented");
Philipp Sumi is right. XamDataGrid looks very "WinFormisch". I would prefer "WPFisch" style, like a standard WPF Selector/MultiSelector control.
Microsoft is now working on it's own DataGrid and it looks very "WPFisch". It is possible to use databinding with 0 (Zero) code. XamDataGrid can't be used without code behind. I had to write many code, only to set some property in my model.
Solution with MultiValueConverter - you don't really mean that, didn't you? Why is it not part of XamDataGrid?
Why XamDataGrid does not have a simple ActiveRecord from type Object. Why XamDataGrid does not makes the conversion itself? It knows better than I what is Record and how it can be converted back to my data objects.
<XamDataGrid ItemsSource={Binding SomeData} SelectedItem={Binding SelectedData} />
That's it. No converters, no code. Just so simple can it be.
I know this post is over a year old, (which makes it kind of sad that I still have the same exact problem). I just wanted to bump it in hopes that Infragistics guys might actually make their WPF controls work in a WPF way rather than a WinForms way.
We're not coding WPF because we love WinForms.
jrhutch -
Thanks for the message bump.
Actually as it turns out, we are adding a get/set property of type object to the latest version (i.e., 9.2) of XamDataGrid called ActiveDataItem that will allow you to implictly set the ActiveRecord knowing only the data item. Similarly, the ActiveDataItem property will be updated whenever the ActiveRecord changes.
Note that when the current ActiveRecord is anything other than a DataRecord (e.g., a GroupByRecord) then ActiveDataItem will be set to null.
If you attempt to set ActiveDataItem to a value that does not exist in the data, the ActiveRecord property will be unchanged.
This change should be part of the upcoming Service Release which will be available at the end of October.
Thx. Joe
Attached is a simple project that shows 2-way binding to ActiveDataItem working.
Hi, this issue is still a problem for me too.
@Joe : could you provide a test solution to see this functionality working ?
I have a same issue. from activeitem to my INotifyPropertyChanged property, it's working (if i click something, my SelectedObject is changed to the clickedvalue). but when my bound object changed, the activeItem didn't change.
All we are doing is exposing a DependencyProperty so yes 2-way binding should work.
In the Output window are you getting any binding error msgs releating to this?
How is your ObjetCourant implemented? Is it a DependencyProperty or just a CLR property? If a CLR property does the class that exposes it implement INotifyPropertyChanged?
Hi,
Thanks for your answer, but it doesn't solve my problem... Here is my xaml implementation :
<igDP:XamDataGrid x:Name="XamDataGrid1" Theme="Office2k7Black" DataSource="{Binding Path=Sieges, Mode=TwoWay}" ActiveDataItem="{Binding Path=ObjetCourant, Mode=TwoWay, Converter={StaticResource activeDataItemConverter
}}">
And the converter :
public class ActiveDataItemConverter : IValueConverter
#region
IValueConverter Members
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) {
return value;
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) {
#endregion
The Convert method is never hit when I mark it with a breakpoint and modify the binded property... Are you sure that the TwoWay mode is supported ?
Sébastien