100 lines
3.6 KiB
C#
100 lines
3.6 KiB
C#
|
|
|
|
|
|
namespace WPFluent.Controls;
|
|
|
|
/// <summary>
|
|
/// Extends <see cref="System.Windows.Controls.ListView"/>, and adds customized support <see
|
|
/// cref="ListViewViewState.GridView"/> or <see cref="ListViewViewState.Default"/>.
|
|
/// </summary>
|
|
/// <example>
|
|
/// <code lang="xml"> /// <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> ///</code>
|
|
/// </example>
|
|
public class ListView : System.Windows.Controls.ListView
|
|
{
|
|
/// <summary>
|
|
/// Identifies the <see cref="ViewState"/> dependency property.
|
|
/// </summary>
|
|
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
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the view state of the <see cref="ListView"/>, enabling custom logic based on the current view.
|
|
/// </summary>
|
|
/// <value>The current view state of the <see cref="ListView"/>.</value>
|
|
public ListViewViewState ViewState
|
|
{
|
|
get => (ListViewViewState)GetValue(ViewStateProperty);
|
|
set => SetValue(ViewStateProperty, value);
|
|
}
|
|
}
|