优化更新代码,添加界面功能并整合
This commit is contained in:
99
WPFluent/Controls/ListView/ListView..cs
Normal file
99
WPFluent/Controls/ListView/ListView..cs
Normal file
@@ -0,0 +1,99 @@
|
||||
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user