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);
}
}