File: System\Windows\Forms\Controls\PropertyGrid\PropertyGridInternal\PropertyGridView.GridViewListBoxAccessibleObject.cs
Web Access
Project: src\src\System.Windows.Forms\src\System.Windows.Forms.csproj (System.Windows.Forms)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Windows.Win32.UI.Accessibility;
using static Interop;
 
namespace System.Windows.Forms.PropertyGridInternal;
 
internal partial class PropertyGridView
{
    /// <summary>
    ///  Represents the PropertyGridView ListBox accessibility object.
    /// </summary>
    private class GridViewListBoxAccessibleObject : ListBox.ListBoxAccessibleObject
    {
        /// <summary>
        ///  Constructs the new instance of GridViewListBoxAccessibleObject.
        /// </summary>
        /// <param name="owningGridViewListBox">The owning GridViewListBox.</param>
        public GridViewListBoxAccessibleObject(GridViewListBox owningGridViewListBox) : base(owningGridViewListBox)
        {
            if (owningGridViewListBox.OwningPropertyGridView is not PropertyGridView owningPropertyGridView)
            {
                throw new ArgumentException(null, nameof(owningGridViewListBox));
            }
        }
 
        internal override IRawElementProviderFragment.Interface? FragmentNavigate(NavigateDirection direction)
        {
            if (!this.TryGetOwnerAs(out GridViewListBox? owner)
                || !owner.OwningPropertyGridView.DropDownVisible
                || owner.OwningPropertyGridView.SelectedGridEntry is null
                || owner.OwningPropertyGridView.DropDownControlHolder.Component != owner
                // Created is set to false in WM_DESTROY, but the window Handle is released on NCDESTROY, which comes after DESTROY.
                // But between these calls, AccessibleObject can be recreated and might cause memory leaks.
                || !owner.OwningPropertyGridView.OwnerGrid.Created)
            {
                return null;
            }
 
            return direction switch
            {
                NavigateDirection.NavigateDirection_Parent => owner.OwningPropertyGridView.DropDownControlHolder.AccessibilityObject,
                _ => base.FragmentNavigate(direction)
            };
        }
 
        public override string? Name => base.Name ?? SR.PropertyGridEntryValuesListDefaultAccessibleName;
 
        private protected override bool IsInternal => true;
 
        internal override bool CanGetNameInternal => false;
 
        internal override IRawElementProviderFragmentRoot.Interface FragmentRoot =>
            this.TryGetOwnerAs(out GridViewListBox? owner)
                ? owner.OwningPropertyGridView.AccessibilityObject
                : UiaCore.StubFragmentRoot.Instance;
    }
}