Remove retired ItemsRepeater control
This commit is contained in:
parent
45472abd1f
commit
0df17a2296
@ -5,26 +5,15 @@
|
|||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="HangoverAvalonia.Controls.CheckedListBox">
|
x:Class="HangoverAvalonia.Controls.CheckedListBox">
|
||||||
|
|
||||||
<UserControl.Resources>
|
|
||||||
<RecyclePool x:Key="RecyclePool" />
|
|
||||||
<DataTemplate x:Key="queuedBook">
|
|
||||||
<CheckBox HorizontalAlignment="Stretch" Margin="10,0,0,0" Content="{Binding Item}" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
|
|
||||||
</DataTemplate>
|
|
||||||
<RecyclingElementFactory x:Key="elementFactory" RecyclePool="{StaticResource RecyclePool}">
|
|
||||||
<RecyclingElementFactory.Templates>
|
|
||||||
<StaticResource x:Key="queuedBook" ResourceKey="queuedBook" />
|
|
||||||
</RecyclingElementFactory.Templates>
|
|
||||||
</RecyclingElementFactory>
|
|
||||||
</UserControl.Resources>
|
|
||||||
|
|
||||||
<ScrollViewer
|
<ScrollViewer
|
||||||
Name="scroller"
|
|
||||||
HorizontalScrollBarVisibility="Disabled"
|
HorizontalScrollBarVisibility="Disabled"
|
||||||
VerticalScrollBarVisibility="Auto">
|
VerticalScrollBarVisibility="Auto">
|
||||||
<ItemsRepeater IsVisible="True"
|
<ItemsControl ItemsSource="{Binding $parent[1].Items}">
|
||||||
VerticalCacheLength="1.2"
|
<ItemsControl.ItemTemplate>
|
||||||
HorizontalCacheLength="1"
|
<DataTemplate>
|
||||||
ItemsSource="{Binding CheckboxItems}"
|
<CheckBox HorizontalAlignment="Stretch" Margin="10,0,0,0" Content="{Binding Item}" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
|
||||||
ItemTemplate="{StaticResource elementFactory}" />
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
@ -2,103 +2,18 @@ using Avalonia;
|
|||||||
using Avalonia.Collections;
|
using Avalonia.Collections;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using HangoverAvalonia.ViewModels;
|
using HangoverAvalonia.ViewModels;
|
||||||
using ReactiveUI;
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace HangoverAvalonia.Controls
|
namespace HangoverAvalonia.Controls;
|
||||||
|
|
||||||
|
public partial class CheckedListBox : UserControl
|
||||||
{
|
{
|
||||||
public partial class CheckedListBox : UserControl
|
public static readonly StyledProperty<AvaloniaList<CheckBoxViewModel>> ItemsProperty =
|
||||||
|
AvaloniaProperty.Register<CheckedListBox, AvaloniaList<CheckBoxViewModel>>(nameof(Items));
|
||||||
|
|
||||||
|
public AvaloniaList<CheckBoxViewModel> Items { get => GetValue(ItemsProperty); set => SetValue(ItemsProperty, value); }
|
||||||
|
|
||||||
|
public CheckedListBox()
|
||||||
{
|
{
|
||||||
public event EventHandler<ItemCheckEventArgs> ItemCheck;
|
InitializeComponent();
|
||||||
|
|
||||||
public static readonly StyledProperty<IEnumerable> ItemsProperty =
|
|
||||||
AvaloniaProperty.Register<CheckedListBox, IEnumerable>(nameof(Items));
|
|
||||||
|
|
||||||
public IEnumerable Items { get => GetValue(ItemsProperty); set => SetValue(ItemsProperty, value); }
|
|
||||||
private CheckedListBoxViewModel _viewModel = new();
|
|
||||||
|
|
||||||
public IEnumerable<object> CheckedItems =>
|
|
||||||
_viewModel
|
|
||||||
.CheckboxItems
|
|
||||||
.Where(i => i.IsChecked)
|
|
||||||
.Select(i => i.Item);
|
|
||||||
|
|
||||||
public void SetItemChecked(int i, bool isChecked) => _viewModel.CheckboxItems[i].IsChecked = isChecked;
|
|
||||||
public void SetItemChecked(object item, bool isChecked)
|
|
||||||
{
|
|
||||||
var obj = _viewModel.CheckboxItems.SingleOrDefault(i => i.Item == item);
|
|
||||||
if (obj is not null)
|
|
||||||
obj.IsChecked = isChecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CheckedListBox()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
scroller.DataContext = _viewModel;
|
|
||||||
_viewModel.CheckedChanged += _viewModel_CheckedChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void _viewModel_CheckedChanged(object sender, CheckBoxViewModel e)
|
|
||||||
{
|
|
||||||
var args = new ItemCheckEventArgs { Item = e.Item, ItemIndex = _viewModel.CheckboxItems.IndexOf(e), IsChecked = e.IsChecked };
|
|
||||||
ItemCheck?.Invoke(this, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
|
|
||||||
{
|
|
||||||
if (change.Property.Name == nameof(Items) && Items != null)
|
|
||||||
_viewModel.SetItems(Items);
|
|
||||||
base.OnPropertyChanged(change);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CheckedListBoxViewModel : ViewModelBase
|
|
||||||
{
|
|
||||||
public event EventHandler<CheckBoxViewModel> CheckedChanged;
|
|
||||||
public AvaloniaList<CheckBoxViewModel> CheckboxItems { get; private set; }
|
|
||||||
|
|
||||||
public void SetItems(IEnumerable items)
|
|
||||||
{
|
|
||||||
UnsubscribeFromItems(CheckboxItems);
|
|
||||||
CheckboxItems = new(items.OfType<object>().Select(o => new CheckBoxViewModel { Item = o }));
|
|
||||||
SubscribeToItems(CheckboxItems);
|
|
||||||
this.RaisePropertyChanged(nameof(CheckboxItems));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubscribeToItems(IEnumerable objects)
|
|
||||||
{
|
|
||||||
foreach (var i in objects.OfType<INotifyPropertyChanged>())
|
|
||||||
i.PropertyChanged += I_PropertyChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UnsubscribeFromItems(AvaloniaList<CheckBoxViewModel> objects)
|
|
||||||
{
|
|
||||||
if (objects is null) return;
|
|
||||||
|
|
||||||
foreach (var i in objects)
|
|
||||||
i.PropertyChanged -= I_PropertyChanged;
|
|
||||||
}
|
|
||||||
private void I_PropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
||||||
{
|
|
||||||
CheckedChanged?.Invoke(this, (CheckBoxViewModel)sender);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public class CheckBoxViewModel : ViewModelBase
|
|
||||||
{
|
|
||||||
private bool _isChecked;
|
|
||||||
public bool IsChecked { get => _isChecked; set => this.RaiseAndSetIfChanged(ref _isChecked, value); }
|
|
||||||
private object _bookText;
|
|
||||||
public object Item { get => _bookText; set => this.RaiseAndSetIfChanged(ref _bookText, value); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ItemCheckEventArgs : EventArgs
|
|
||||||
{
|
|
||||||
public int ItemIndex { get; init; }
|
|
||||||
public bool IsChecked { get; init; }
|
|
||||||
public object Item { get; init; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -76,7 +76,6 @@
|
|||||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.3.0" />
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.3.0" />
|
||||||
<PackageReference Include="Avalonia.ReactiveUI" Version="11.3.0" />
|
<PackageReference Include="Avalonia.ReactiveUI" Version="11.3.0" />
|
||||||
<PackageReference Include="Avalonia.Controls.ItemsRepeater" Version="11.1.5" />
|
|
||||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.0" />
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
11
Source/HangoverAvalonia/ViewModels/CheckBoxViewModel.cs
Normal file
11
Source/HangoverAvalonia/ViewModels/CheckBoxViewModel.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
|
namespace HangoverAvalonia.ViewModels;
|
||||||
|
|
||||||
|
public class CheckBoxViewModel : ViewModelBase
|
||||||
|
{
|
||||||
|
private bool _isChecked;
|
||||||
|
public bool IsChecked { get => _isChecked; set => this.RaiseAndSetIfChanged(ref _isChecked, value); }
|
||||||
|
private object _bookText;
|
||||||
|
public object Item { get => _bookText; set => this.RaiseAndSetIfChanged(ref _bookText, value); }
|
||||||
|
}
|
||||||
@ -5,26 +5,15 @@
|
|||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="LibationAvalonia.Controls.CheckedListBox">
|
x:Class="LibationAvalonia.Controls.CheckedListBox">
|
||||||
|
|
||||||
<UserControl.Resources>
|
|
||||||
<RecyclePool x:Key="RecyclePool" />
|
|
||||||
<DataTemplate x:Key="queuedBook">
|
|
||||||
<CheckBox HorizontalAlignment="Stretch" Margin="10,0,0,0" Content="{Binding Item}" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
|
|
||||||
</DataTemplate>
|
|
||||||
<RecyclingElementFactory x:Key="elementFactory" RecyclePool="{StaticResource RecyclePool}">
|
|
||||||
<RecyclingElementFactory.Templates>
|
|
||||||
<StaticResource x:Key="queuedBook" ResourceKey="queuedBook" />
|
|
||||||
</RecyclingElementFactory.Templates>
|
|
||||||
</RecyclingElementFactory>
|
|
||||||
</UserControl.Resources>
|
|
||||||
|
|
||||||
<ScrollViewer
|
<ScrollViewer
|
||||||
Name="scroller"
|
|
||||||
HorizontalScrollBarVisibility="Disabled"
|
HorizontalScrollBarVisibility="Disabled"
|
||||||
VerticalScrollBarVisibility="Auto">
|
VerticalScrollBarVisibility="Auto">
|
||||||
<ItemsRepeater IsVisible="True"
|
<ItemsControl ItemsSource="{Binding $parent[1].Items}">
|
||||||
VerticalCacheLength="1.2"
|
<ItemsControl.ItemTemplate>
|
||||||
HorizontalCacheLength="1"
|
<DataTemplate>
|
||||||
ItemsSource="{Binding CheckboxItems}"
|
<CheckBox HorizontalAlignment="Stretch" Margin="10,0,0,0" Content="{Binding Item}" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
|
||||||
ItemTemplate="{StaticResource elementFactory}" />
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
@ -12,24 +12,10 @@ namespace LibationAvalonia.Controls
|
|||||||
AvaloniaProperty.Register<CheckedListBox, AvaloniaList<CheckBoxViewModel>>(nameof(Items));
|
AvaloniaProperty.Register<CheckedListBox, AvaloniaList<CheckBoxViewModel>>(nameof(Items));
|
||||||
|
|
||||||
public AvaloniaList<CheckBoxViewModel> Items { get => GetValue(ItemsProperty); set => SetValue(ItemsProperty, value); }
|
public AvaloniaList<CheckBoxViewModel> Items { get => GetValue(ItemsProperty); set => SetValue(ItemsProperty, value); }
|
||||||
private CheckedListBoxViewModel _viewModel = new();
|
|
||||||
|
|
||||||
public CheckedListBox()
|
public CheckedListBox()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
scroller.DataContext = _viewModel;
|
|
||||||
}
|
|
||||||
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
|
|
||||||
{
|
|
||||||
if (change.Property.Name == nameof(Items) && Items != null)
|
|
||||||
_viewModel.CheckboxItems = Items;
|
|
||||||
base.OnPropertyChanged(change);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class CheckedListBoxViewModel : ViewModelBase
|
|
||||||
{
|
|
||||||
private AvaloniaList<CheckBoxViewModel> _checkboxItems;
|
|
||||||
public AvaloniaList<CheckBoxViewModel> CheckboxItems { get => _checkboxItems; set => this.RaiseAndSetIfChanged(ref _checkboxItems, value); }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -77,7 +77,6 @@
|
|||||||
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.0" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'" />
|
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.0" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'" />
|
||||||
<PackageReference Include="Avalonia" Version="11.3.0" />
|
<PackageReference Include="Avalonia" Version="11.3.0" />
|
||||||
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.0" />
|
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.0" />
|
||||||
<PackageReference Include="Avalonia.Controls.ItemsRepeater" Version="11.1.5" />
|
|
||||||
<PackageReference Include="Avalonia.Desktop" Version="11.3.0" />
|
<PackageReference Include="Avalonia.Desktop" Version="11.3.0" />
|
||||||
<PackageReference Include="Avalonia.ReactiveUI" Version="11.3.0" />
|
<PackageReference Include="Avalonia.ReactiveUI" Version="11.3.0" />
|
||||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.0" />
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.0" />
|
||||||
|
|||||||
@ -10,23 +10,13 @@
|
|||||||
Background="{DynamicResource SystemRegionColor}"
|
Background="{DynamicResource SystemRegionColor}"
|
||||||
x:Class="LibationAvalonia.Views.ProcessQueueControl">
|
x:Class="LibationAvalonia.Views.ProcessQueueControl">
|
||||||
|
|
||||||
<UserControl.Resources>
|
|
||||||
<views:DecimalConverter x:Key="myConverter" />
|
|
||||||
<RecyclePool x:Key="RecyclePool" />
|
|
||||||
<DataTemplate x:Key="queuedBook">
|
|
||||||
<views:ProcessBookControl />
|
|
||||||
</DataTemplate>
|
|
||||||
<RecyclingElementFactory x:Key="elementFactory" RecyclePool="{StaticResource RecyclePool}">
|
|
||||||
<RecyclingElementFactory.Templates>
|
|
||||||
<StaticResource x:Key="queuedBook" ResourceKey="queuedBook" />
|
|
||||||
</RecyclingElementFactory.Templates>
|
|
||||||
</RecyclingElementFactory>
|
|
||||||
</UserControl.Resources>
|
|
||||||
|
|
||||||
<Grid RowDefinitions="*,Auto">
|
<Grid RowDefinitions="*,Auto">
|
||||||
<TabControl Grid.Row="0">
|
<TabControl Grid.Row="0">
|
||||||
<TabControl.Styles>
|
<TabControl.Styles>
|
||||||
<Style Selector="ItemsPresenter#PART_ItemsPresenter">
|
<Style Selector="TabControl /template/ ItemsPresenter#PART_ItemsPresenter">
|
||||||
|
<Setter Property="Height" Value="33"/>
|
||||||
|
</Style>
|
||||||
|
<Style Selector="TabItem /template/ Border#PART_LayoutRoot">
|
||||||
<Setter Property="Height" Value="33"/>
|
<Setter Property="Height" Value="33"/>
|
||||||
</Style>
|
</Style>
|
||||||
</TabControl.Styles>
|
</TabControl.Styles>
|
||||||
@ -42,14 +32,13 @@
|
|||||||
HorizontalScrollBarVisibility="Disabled"
|
HorizontalScrollBarVisibility="Disabled"
|
||||||
VerticalScrollBarVisibility="Auto"
|
VerticalScrollBarVisibility="Auto"
|
||||||
AllowAutoHide="False">
|
AllowAutoHide="False">
|
||||||
<ItemsRepeater IsVisible="True"
|
<ItemsControl ItemsSource="{Binding Items}">
|
||||||
Grid.Column="0"
|
<ItemsControl.ItemTemplate>
|
||||||
Name="repeater"
|
<DataTemplate>
|
||||||
VerticalCacheLength="1.2"
|
<views:ProcessBookControl DataContext="{Binding}" />
|
||||||
HorizontalCacheLength="1"
|
</DataTemplate>
|
||||||
Background="Transparent"
|
</ItemsControl.ItemTemplate>
|
||||||
ItemsSource="{Binding Items}"
|
</ItemsControl>
|
||||||
ItemTemplate="{StaticResource elementFactory}" />
|
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</Border>
|
</Border>
|
||||||
<Grid Grid.Column="0" Grid.Row="1" ColumnDefinitions="*,Auto,Auto">
|
<Grid Grid.Column="0" Grid.Row="1" ColumnDefinitions="*,Auto,Auto">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user