dotnet/wpf · error · InvalidOperationException
SR.DisplayMemberPathAndItemTemplateSelectorDefined
Error message
SR.DisplayMemberPathAndItemTemplateSelectorDefined
What it means
ItemsControl throws InvalidOperationException (SR.DisplayMemberPathAndItemTemplateSelectorDefined) when DisplayMemberPath (or ItemStringFormat) changes and an ItemTemplateSelector that is not the internal DisplayMemberTemplateSelector is already locally set. DisplayMemberPath works by installing its own template selector, so defining both an explicit ItemTemplateSelector and a DisplayMemberPath is ambiguous and forbidden.
Solutions
- Choose one mechanism: either DisplayMemberPath (simple text display) or ItemTemplateSelector (custom logic), not both.
- If you need custom templates, clear DisplayMemberPath (ItemsControl.DisplayMemberPath = String.Empty) and use DataTemplateSelector alone.
- Use a DataTemplate with a binding to the property formerly named in DisplayMemberPath instead.
- If the selector must co-exist with DisplayMemberPath semantics, fold the DisplayMemberPath logic into your own DisplayMemberTemplateSelector-equivalent.
Example fix
// before listBox.DisplayMemberPath = "Name"; // throws: ItemTemplateSelector already set locally // after listBox.DisplayMemberPath = String.Empty; // drop DMP, rely on the selector // or remove: listBox.ItemTemplateSelector = null; before setting DisplayMemberPath
Defensive patterns
Strategy: type-guard
Validate before calling
static bool CanSetDisplayMemberPath(ItemsControl c) =>
(c.ItemTemplateSelector is DisplayMemberTemplateSelector || c.ItemTemplateSelector == null) ||
c.ItemTemplateSelector == null; Type guard
bool SafeToUseDisplayMemberPath(ItemsControl c) =>
c.ReadLocalValue(ItemsControl.ItemTemplateSelectorProperty) == DependencyProperty.UnsetValue
|| c.ItemTemplateSelector == null; Try / catch
try { itemsControl.DisplayMemberPath = "Name"; }
catch (InvalidOperationException ex) when (ex.Message.Contains("DisplayMemberPath"))
{
itemsControl.DisplayMemberPath = String.Empty; // clear conflicting setting
itemsControl.DisplayMemberPath = "Name";
} Prevention
- Pick DisplayMemberPath OR ItemTemplateSelector per control, never both
- Check ReadLocalValue(ItemTemplateSelectorProperty) before assigning DisplayMemberPath
- Search XAML for controls that declare both attributes
- Centralize template selection in one DataTemplateSelector and avoid DisplayMemberPath entirely
When it happens
Trigger: Setting ItemsControl.DisplayMemberPath (or ItemStringFormat) in code after having locally assigned ItemTemplateSelector, or vice versa; setting DisplayMemberPath when ItemTemplateSelector was set in a style while DisplayMemberPath is not a local value.
Common situations: XAML with both DisplayMemberPath="Name" and ItemTemplateSelector set on the same ItemsControl; code-behind assigning ItemTemplateSelector after the designer set DisplayMemberPath; styling an ItemsControl with a template selector while the app sets DisplayMemberPath locally.
Related errors
- SR.DisplayMemberPathAndItemTemplateDefined
- SR.ItemTemplateSelectorBreaksDisplayMemberPath
- ' ' can only host a ' ' or a ' '. ' ' is an invalid…
- A panel with IsItemsHost="true" is not nested in an…
- Cannot explicitly modify Children collection of Panel used…
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/07c2005ea90ba7b5.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/ItemsControl.cs:412
{
string displayMemberPath = DisplayMemberPath;
string itemStringFormat = ItemStringFormat;
if (!String.IsNullOrEmpty(displayMemberPath) || !String.IsNullOrEmpty(itemStringFormat))
{
// One or both of DisplayMemberPath and ItemStringFormat are desired.
// Set ItemTemplateSelector to an appropriate object, provided that
// this doesn't conflict with the user's own setting.
DataTemplateSelector itemTemplateSelector = ItemTemplateSelector;
if (itemTemplateSelector != null && !(itemTemplateSelector is DisplayMemberTemplateSelector))
{
// if ITS was actually set to something besides a DisplayMember selector,
// it's an error to overwrite it with a DisplayMember selector
// unless ITS came from a style and DMP is local
if (ReadLocalValue(ItemTemplateSelectorProperty) != DependencyProperty.UnsetValue ||
ReadLocalValue(DisplayMemberPathProperty) == DependencyProperty.UnsetValue)
{
throw new InvalidOperationException(SR.DisplayMemberPathAndItemTemplateSelectorDefined);
}
}
// now set the ItemTemplateSelector to use the new DisplayMemberPath and ItemStringFormat
ItemTemplateSelector = new DisplayMemberTemplateSelector(DisplayMemberPath, ItemStringFormat);
}
else
{
// Neither property is desired. Clear the ItemTemplateSelector if
// we had set it earlier.
if (ItemTemplateSelector is DisplayMemberTemplateSelector)
{
ClearValue(ItemTemplateSelectorProperty);
}
}
}
/// <summary>View on GitHub (pinned to 81131a70a4)