Setting up a Property Grid component for Unified Selection
As described in the Property Grid selection handling section, interaction between the Property Grid component and Unified Selection is one way - from Unified Selection to the Property Grid. That means that whenever Unified Selection changes, the content in the Property Grid is reloaded to represent what is selected.
Reference
The Reference section in Unified Selection page describes the core APIs used in Unified Selection workflows.
The @itwin/presentation-components
package delivers usePropertyDataProviderWithUnifiedSelection hook to make setting up Property Grid components to work with Unified Selection easier. The hook takes an IPresentationPropertyDataProvider and updates its keys
prop whenever Unified Selection changes.
Example
The below example shows how to create a very basic presentation rules driven Property Grid component and hook it into Unified Selection. The latter part is achieved by using usePropertyDataProviderWithUnifiedSelection on the data provider.
function MyPropertyGrid(props: { imodel: IModelConnection }) {
// create a presentation rules driven data provider; the provider implements `IDisposable`, so we
// create it through `useOptionalDisposable` hook to make sure it's properly cleaned up
const dataProvider = useOptionalDisposable(
useCallback(() => {
return new PresentationPropertyDataProvider({ imodel: props.imodel });
}, [props.imodel]),
);
if (!dataProvider) {
return null;
}
// render the property grid
return <MyPropertyGridWithProvider dataProvider={dataProvider} />;
}
function MyPropertyGridWithProvider({ dataProvider }: { dataProvider: PresentationPropertyDataProvider }) {
// set up the data provider to be notified about changes in unified selection
const { isOverLimit, numSelectedElements } = usePropertyDataProviderWithUnifiedSelection({ dataProvider });
// width and height should generally we computed using ResizeObserver API or one of its derivatives
const [width] = useState(400);
const [height] = useState(600);
// data provider is going to be empty if no elements are selected
if (numSelectedElements === 0) {
return <>Select an element to see its properties</>;
}
// there's little value in loading properties for many elements (see `PropertyDataProviderWithUnifiedSelectionProps.requestedContentInstancesLimit`)
if (isOverLimit) {
return <>Please select less elements</>;
}
// render the property grid
return <VirtualizedPropertyGridWithDataProvider dataProvider={dataProvider} width={width} height={height} />;
}
Last Updated: 15 May, 2024