I have seen the example that uses a slider control for a custom editor. Using that as a base, I tried to use a ComboBox instead of the slider. The ComboBox shows the bound ItemsSource just fine, but I cannot get the default item set based on the existing value in the property, and when I change the item, I get the error:
A first chance exception of type 'System.NullReferenceException' occurred in InfragisticsWPF4.Controls.Editors.XamPropertyGrid.v14.2.dllSystem.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=Value; DataItem='PropertyGridPropertyItem' (HashCode=38992001); target element is 'ComboBox' (Name=''); target property is 'SelectedItem' (type 'Object') NullReferenceException:'System.NullReferenceException: Object reference not set to an instance of an object. at Infragistics.Controls.Editors.PropertyGridPropertyItem.OnValuePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) at MS.Internal.Data.PropertyPathWorker.SetValue(Object item, Object value) at MS.Internal.Data.ClrBindingWorker.UpdateValue(Object value) at System.Windows.Data.BindingExpression.UpdateSource(Object value)'
There is a null reference in there somewhere, but not in my immediate code (the setter never even gets called, the crash happens before the data is sent form the property grid to the bound object).Here is the XAML snippet:
<ig:XamPropertyGrid SelectedObject="{Binding Model}" > <ig:XamPropertyGrid.EditorDefinitions> <ig:PropertyGridEditorDefinition> <ig:PropertyGridEditorDefinition.TargetProperties> <sys:String>AAADropdownTest</sys:String> </ig:PropertyGridEditorDefinition.TargetProperties> <ig:PropertyGridEditorDefinition.EditTemplate> <DataTemplate> <ComboBox ItemsSource="{Binding DataContext.MyItemList, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneWay}" DisplayMemberPath="Name" SelectedItem="{Binding Path=Value, Mode=TwoWay}"> </ComboBox> </DataTemplate> </ig:PropertyGridEditorDefinition.EditTemplate> </ig:PropertyGridEditorDefinition> </ig:XamPropertyGrid.EditorDefinitions> </ig:XamPropertyGrid>
The databound Model property AAADropdownTest is of the same type that the MyItemList collection contains.
Do you have a working example of a ComboBox editor in a PropertyGrid? Thanks!!!
Hi,
I'm attaching a sample that includes a comboBox in one of the PropertyGridEditorDefinitions.
The Person that is defined in the XamPropertyGrid has a Child, whose name can be selected from the comboBox dropdown. The ComboBox's ItemSource is bound to a StaticResource of Children.
You'll see that the SelectedItem is using a MultiBinding Converter in order to set the SelectedItem based on the Value and the Children collection. And since the Value is using Mode=TwoWay the Child value on the Person object is also updated.
Please let me know if you have any questions.
Perfect! This was exactly what I needed - thank you.