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

  1. Choose one mechanism: either DisplayMemberPath (simple text display) or ItemTemplateSelector (custom logic), not both.
  2. If you need custom templates, clear DisplayMemberPath (ItemsControl.DisplayMemberPath = String.Empty) and use DataTemplateSelector alone.
  3. Use a DataTemplate with a binding to the property formerly named in DisplayMemberPath instead.
  4. 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

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


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)