namespace WPFluent.Controls; /// /// Extends , and adds customized support or . /// /// /// /// <ui:ListView ItemsSource="{Binding ...}" > /// <ui:ListView.View> /// /// <ui:GridView> /// <GridViewColumn /// DisplayMemberBinding="{Binding /// FirstName}" /// Header="First Name" /> /// <GridViewColumn /// /// DisplayMemberBinding="{Binding LastName}" /// Header="Last Name" /> /// /// </ui:GridView> /// </ui:ListView.View> /// </ui:ListView> /// /// public class ListView : System.Windows.Controls.ListView { /// /// Identifies the dependency property. /// public static readonly DependencyProperty ViewStateProperty = DependencyProperty.Register( nameof(ViewState), typeof(ListViewViewState), typeof(ListView), new FrameworkPropertyMetadata(ListViewViewState.Default, OnViewStateChanged)); private DependencyPropertyDescriptor? _descriptor; static ListView() { DefaultStyleKeyProperty.OverrideMetadata(typeof(ListView), new FrameworkPropertyMetadata(typeof(ListView))); } public ListView() { Loaded += OnLoaded; Unloaded += OnUnloaded; } private void OnLoaded(object sender, RoutedEventArgs e) { Loaded -= OnLoaded; // prevent memory leaks // Setup initial ViewState and hook into View property changes _descriptor = DependencyPropertyDescriptor.FromProperty( System.Windows.Controls.ListView.ViewProperty, typeof(System.Windows.Controls.ListView)); _descriptor?.AddValueChanged(this, OnViewPropertyChanged); UpdateViewState(); // set the initial state } private void OnUnloaded(object sender, RoutedEventArgs e) { Unloaded -= OnUnloaded; _descriptor?.RemoveValueChanged(this, OnViewPropertyChanged); } private void OnViewPropertyChanged(object? sender, EventArgs e) { UpdateViewState(); } private static void OnViewStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if(d is not ListView self) { return; } self.OnViewStateChanged(e); } private void UpdateViewState() { ListViewViewState viewState = View switch { System.Windows.Controls.GridView => ListViewViewState.GridView, null => ListViewViewState.Default, _ => ListViewViewState.Default, }; SetCurrentValue(ViewStateProperty, viewState); } protected override DependencyObject GetContainerForItemOverride() { return new ListViewItem(); } protected override bool IsItemItsOwnContainerOverride(object item) { return item is ListViewItem; } protected virtual void OnViewStateChanged(DependencyPropertyChangedEventArgs e) { // Hook for derived classes to react to ViewState property changes } /// /// Gets or sets the view state of the , enabling custom logic based on the current view. /// /// The current view state of the . public ListViewViewState ViewState { get => (ListViewViewState)GetValue(ViewStateProperty); set => SetValue(ViewStateProperty, value); } }