From 55d472300e674f4a67bfc63bd8bec0c7f614d59c Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:16:12 +0800 Subject: [PATCH 1/2] misc: remove x:CompileBindings attribute from multiple XAML files. --- demo/Semi.Avalonia.Demo/App.axaml | 5 ++--- demo/Semi.Avalonia.Demo/Pages/AboutUs.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml | 3 +-- demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml | 4 ++++ demo/Semi.Avalonia.Demo/Pages/ComboBoxDemo.axaml | 3 ++- demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/RefreshContainerDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/SplitViewDemo.axaml | 3 ++- demo/Semi.Avalonia.Demo/Pages/TabControlDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/TabStripDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml | 1 - demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml | 3 +-- demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj | 1 + demo/Semi.Avalonia.Demo/Themes/ColorDetailControl.axaml | 3 +-- demo/Semi.Avalonia.Demo/Themes/ColorItemControl.axaml | 3 +-- .../Themes/FunctionalColorGroupControl.axaml | 1 - demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml | 1 - demo/Semi.Avalonia.Demo/Views/MainView.axaml | 1 - 21 files changed, 15 insertions(+), 25 deletions(-) diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml index 8ef2cca..472efd6 100644 --- a/demo/Semi.Avalonia.Demo/App.axaml +++ b/demo/Semi.Avalonia.Demo/App.axaml @@ -2,10 +2,9 @@ x:Class="Semi.Avalonia.Demo.App" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - x:CompileBindings="True" - x:DataType="viewModels:ApplicationViewModel" xmlns:semi="https://irihi.tech/semi" - xmlns:viewModels="clr-namespace:Semi.Avalonia.Demo.ViewModels"> + xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels" + x:DataType="vm:ApplicationViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Pages/AboutUs.axaml b/demo/Semi.Avalonia.Demo/Pages/AboutUs.axaml index 6fa1c0b..6f470a6 100644 --- a/demo/Semi.Avalonia.Demo/Pages/AboutUs.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/AboutUs.axaml @@ -8,7 +8,6 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels" x:DataType="vm:AboutUsViewModel" - x:CompileBindings="True" d:DesignHeight="450" d:DesignWidth="800" mc:Ignorable="d"> diff --git a/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml index bb33519..c0fa49c 100644 --- a/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml @@ -7,7 +7,6 @@ xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels" d:DesignHeight="450" d:DesignWidth="800" - x:CompileBindings="False" x:DataType="vm:AutoCompleteBoxDemoViewModel" mc:Ignorable="d"> @@ -30,7 +29,7 @@ + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> diff --git a/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml index 83b3be2..032b157 100644 --- a/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml @@ -8,6 +8,10 @@ d:DesignWidth="800" mc:Ignorable="d"> + + + + + mc:Ignorable="d" + x:DataType="vm:ComboBoxDemoViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml index 69a0bea..8fb13a9 100644 --- a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml @@ -7,7 +7,6 @@ xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels;assembly=Semi.Avalonia.Demo" d:DesignHeight="450" d:DesignWidth="800" - x:CompileBindings="True" x:DataType="vm:DataGridDemoViewModel" mc:Ignorable="d"> diff --git a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml index 2f4288e..82f2ad8 100644 --- a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml @@ -8,7 +8,6 @@ xmlns:pages="clr-namespace:Semi.Avalonia.Demo.Pages" mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="1450" x:DataType="vm:HighContrastDemoViewModel" - x:CompileBindings="True" x:Class="Semi.Avalonia.Demo.Pages.HighContrastDemo"> diff --git a/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml index e2e4347..f034e58 100644 --- a/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml @@ -8,7 +8,6 @@ xmlns:viewModels="clr-namespace:Semi.Avalonia.Demo.ViewModels" d:DesignHeight="450" d:DesignWidth="800" - x:CompileBindings="True" x:DataType="viewModels:PaletteDemoViewModel" mc:Ignorable="d"> diff --git a/demo/Semi.Avalonia.Demo/Pages/RefreshContainerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/RefreshContainerDemo.axaml index 0de521a..9ba816e 100644 --- a/demo/Semi.Avalonia.Demo/Pages/RefreshContainerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/RefreshContainerDemo.axaml @@ -8,7 +8,6 @@ d:DesignHeight="450" d:DesignWidth="800" x:DataType="vm:RefreshContainerDemoViewModel" - x:CompileBindings="True" mc:Ignorable="d"> diff --git a/demo/Semi.Avalonia.Demo/Pages/SplitViewDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/SplitViewDemo.axaml index 21ac243..bd8fb68 100644 --- a/demo/Semi.Avalonia.Demo/Pages/SplitViewDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/SplitViewDemo.axaml @@ -7,7 +7,8 @@ xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels" d:DesignHeight="1000" d:DesignWidth="800" - mc:Ignorable="d"> + mc:Ignorable="d" + x:DataType="vm:SplitViewDemoViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Pages/TabControlDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TabControlDemo.axaml index f62cae8..dc2398c 100644 --- a/demo/Semi.Avalonia.Demo/Pages/TabControlDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/TabControlDemo.axaml @@ -7,7 +7,6 @@ xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels;assembly=Semi.Avalonia.Demo" d:DesignHeight="450" d:DesignWidth="800" - x:CompileBindings="True" x:DataType="vm:TabControlDemoViewModel" mc:Ignorable="d"> diff --git a/demo/Semi.Avalonia.Demo/Pages/TabStripDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TabStripDemo.axaml index 2c78639..b078cba 100644 --- a/demo/Semi.Avalonia.Demo/Pages/TabStripDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/TabStripDemo.axaml @@ -5,7 +5,6 @@ xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Semi.Avalonia.Demo.Pages.TabStripDemo" - x:CompileBindings="True" x:DataType="vm:TabStripDemoViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml index d6453f4..7ed1930 100644 --- a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml @@ -6,7 +6,6 @@ xmlns:converters="clr-namespace:Semi.Avalonia.Demo.Converters" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Semi.Avalonia.Demo.Pages.TreeDataGridDemo" - x:CompileBindings="True" x:DataType="vm:TreeDataGridDemoViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml index ef58855..3d5c757 100644 --- a/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml @@ -8,7 +8,6 @@ xmlns:vm="clr-namespace:Semi.Avalonia.Demo.Pages" d:DesignHeight="450" d:DesignWidth="800" - x:CompileBindings="True" x:DataType="vm:TreeViewVm" mc:Ignorable="d"> diff --git a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml index 3282f7b..a30eac7 100644 --- a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml @@ -6,8 +6,7 @@ xmlns:pages="clr-namespace:Semi.Avalonia.Demo.Pages" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Semi.Avalonia.Demo.Pages.VariablesDemo" - x:DataType="vm:VariablesDemoViewModel" - x:CompileBindings="True"> + x:DataType="vm:VariablesDemoViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj index e4a0aa4..20ec53d 100644 --- a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj +++ b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj @@ -3,6 +3,7 @@ net8.0 enable latest + true diff --git a/demo/Semi.Avalonia.Demo/Themes/ColorDetailControl.axaml b/demo/Semi.Avalonia.Demo/Themes/ColorDetailControl.axaml index 999b7f9..accc340 100644 --- a/demo/Semi.Avalonia.Demo/Themes/ColorDetailControl.axaml +++ b/demo/Semi.Avalonia.Demo/Themes/ColorDetailControl.axaml @@ -1,8 +1,7 @@ + xmlns:controls="clr-namespace:Semi.Avalonia.Demo.Controls"> diff --git a/demo/Semi.Avalonia.Demo/Themes/ColorItemControl.axaml b/demo/Semi.Avalonia.Demo/Themes/ColorItemControl.axaml index 07f5835..7169196 100644 --- a/demo/Semi.Avalonia.Demo/Themes/ColorItemControl.axaml +++ b/demo/Semi.Avalonia.Demo/Themes/ColorItemControl.axaml @@ -1,8 +1,7 @@ + xmlns:controls="using:Semi.Avalonia.Demo.Controls"> diff --git a/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml b/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml index e48d547..1b65098 100644 --- a/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml +++ b/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml @@ -4,7 +4,6 @@ xmlns:controls="clr-namespace:Semi.Avalonia.Demo.Controls" xmlns:viewModels="clr-namespace:Semi.Avalonia.Demo.ViewModels" xmlns:pages="clr-namespace:Semi.Avalonia.Demo.Pages" - x:CompileBindings="True" x:DataType="viewModels:FunctionalColorGroupViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml b/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml index 286b13c..5028edf 100644 --- a/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml +++ b/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml @@ -4,7 +4,6 @@ xmlns:controls="clr-namespace:Semi.Avalonia.Demo.Controls" xmlns:viewModels="clr-namespace:Semi.Avalonia.Demo.ViewModels" xmlns:pages="clr-namespace:Semi.Avalonia.Demo.Pages" - x:CompileBindings="True" x:DataType="viewModels:ShadowGroupViewModel"> diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml b/demo/Semi.Avalonia.Demo/Views/MainView.axaml index fdbe2bd..639de3c 100644 --- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml +++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml @@ -8,7 +8,6 @@ xmlns:views="clr-namespace:Semi.Avalonia.Demo.Views" d:DesignHeight="450" d:DesignWidth="800" - x:CompileBindings="True" x:DataType="views:MainViewModel" mc:Ignorable="d"> From 521ed1bd0f5719cb9399a7855863ddada3baa502 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Fri, 26 Sep 2025 00:46:24 +0800 Subject: [PATCH 2/2] misc: reduce publish warning. --- .../Pages/AutoCompleteBoxDemo.axaml | 22 +++---- .../Pages/NotificationDemo.axaml.cs | 3 +- .../Pages/TreeDataGridDemo.axaml.cs | 5 +- .../Pages/TreeViewDemo.axaml.cs | 57 +++++++++++-------- .../ViewModels/IconDemoViewModel.cs | 13 ++--- .../TreeDataGridDemo/FilesPageViewModel.cs | 29 +++++----- .../TreeDataGrid.axaml | 3 +- 7 files changed, 69 insertions(+), 63 deletions(-) diff --git a/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml index c0fa49c..614efa4 100644 --- a/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml @@ -32,37 +32,37 @@ ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> @@ -70,17 +70,17 @@ Width="100" IsEnabled="False" Watermark="Disabled" - ValueMemberBinding="{ReflectionBinding Name}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> + ValueMemberBinding="{Binding Name,DataType=vm:StateData}" /> diff --git a/demo/Semi.Avalonia.Demo/Pages/NotificationDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/NotificationDemo.axaml.cs index 4392a7a..15150ba 100644 --- a/demo/Semi.Avalonia.Demo/Pages/NotificationDemo.axaml.cs +++ b/demo/Semi.Avalonia.Demo/Pages/NotificationDemo.axaml.cs @@ -27,7 +27,8 @@ public partial class NotificationDemo : UserControl if (sender is RadioButton b && b.Content is string s) { Enum.TryParse(s, out var t); - _manager.Position = t; + if (_manager is not null) + _manager.Position = t; } } diff --git a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs index 9da4a82..5c511cb 100644 --- a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs +++ b/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs @@ -14,10 +14,9 @@ public partial class TreeDataGridDemo : UserControl private void SelectedPath_KeyDown(object? sender, KeyEventArgs e) { - if (e.Key == Key.Enter) + if (e.Key == Key.Enter && DataContext is TreeDataGridDemoViewModel vm) { - var vm = DataContext as TreeDataGridDemoViewModel; - vm.FilesContext.SelectedPath = (sender as TextBox)!.Text; + vm.FilesContext.SelectedPath = (sender as TextBox)?.Text; } } } \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml.cs index 3dd9451..84aad31 100644 --- a/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml.cs +++ b/demo/Semi.Avalonia.Demo/Pages/TreeViewDemo.axaml.cs @@ -21,33 +21,40 @@ public class TreeViewVm : ObservableObject public TreeViewVm() { - Items = new ObservableCollection() - { - new TreeViewItemVm() { Name = "Item 1", Id = "1" }, - new TreeViewItemVm() { Name = "Item 2", Id = "2" }, - new TreeViewItemVm() + Items = + [ + new TreeViewItemVm { Name = "Item 1", Id = "1" }, + new TreeViewItemVm { Name = "Item 2", Id = "2" }, + new TreeViewItemVm { - Name = "Item 3", Id = "3", Items = new ObservableCollection() - { - new TreeViewItemVm() { Name = "Item 3.1", Id = "3.1" }, - new TreeViewItemVm() { Name = "Item 3.2", Id = "3.2" }, - new TreeViewItemVm() { Name = "Item 3.3", Id = "3.3" }, - }, - }, - }; + Name = "Item 3", Id = "3", Items = + [ + new TreeViewItemVm { Name = "Item 3.1", Id = "3.1" }, + new TreeViewItemVm { Name = "Item 3.2", Id = "3.2" }, + new TreeViewItemVm { Name = "Item 3.3", Id = "3.3" } + ], + } - MultipleLevelItems = new(); - for (int i = 1; i < 6; i++) + ]; + + MultipleLevelItems = []; + for (var i = 1; i < 6; i++) { - FirstItem firstItem = new FirstItem { Id = i, Name = $"FirstItem {i}" }; - firstItem.SecondItems = new(); - for (int j = 1; j < 6; j++) + var firstItem = new FirstItem { - SecondItem secondItem = new SecondItem { Id = j, Name = $"SecondItem {j}" }; - secondItem.ThirdItemItems = new(); - for (int k = 1; k < 6; k++) + Id = i, Name = $"FirstItem {i}", + SecondItems = [] + }; + for (var j = 1; j < 6; j++) + { + var secondItem = new SecondItem { - ThirdItem thirdItem = new ThirdItem { Id = k, Name = $"ThirdItem {k}" }; + Id = j, Name = $"SecondItem {j}", + ThirdItemItems = [] + }; + for (var k = 1; k < 6; k++) + { + var thirdItem = new ThirdItem { Id = k, Name = $"ThirdItem {k}" }; secondItem.ThirdItemItems.Add(thirdItem); } @@ -61,9 +68,9 @@ public class TreeViewVm : ObservableObject public partial class TreeViewItemVm : ObservableObject { - public ObservableCollection Items { get; set; } - public string Name { get; set; } - public string Id { get; set; } + public ObservableCollection Items { get; set; } = []; + public string? Name { get; set; } + public string? Id { get; set; } } public class ItemBase diff --git a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs index d731fc9..8cb1851 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs @@ -10,7 +10,7 @@ namespace Semi.Avalonia.Demo.ViewModels; public partial class IconDemoViewModel : ObservableObject { - private readonly IResourceDictionary? _resources = new Icons(); + private readonly Icons _resources = new(); private readonly Dictionary _filledIcons = new(); private readonly Dictionary _strokedIcons = new(); @@ -22,8 +22,6 @@ public partial class IconDemoViewModel : ObservableObject public void InitializeResources() { - if (_resources is null) return; - foreach (var provider in _resources.MergedDictionaries) { if (provider is not ResourceDictionary dic) continue; @@ -31,16 +29,17 @@ public partial class IconDemoViewModel : ObservableObject foreach (var key in dic.Keys) { if (dic[key] is not Geometry geometry) continue; + var resourceKey = key.ToString() ?? string.Empty; var icon = new IconItem { - ResourceKey = key.ToString(), + ResourceKey = resourceKey, Geometry = geometry }; - if (key.ToString().EndsWith("Stroked")) - _strokedIcons[key.ToString()] = icon; + if (resourceKey.EndsWith("Stroked", StringComparison.InvariantCultureIgnoreCase)) + _strokedIcons[resourceKey] = icon; else - _filledIcons[key.ToString()] = icon; + _filledIcons[resourceKey] = icon; } } diff --git a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs index 587f415..a01d430 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs @@ -19,9 +19,15 @@ public partial class FilesPageViewModel : ObservableObject public IList Drives { get; } public HierarchicalTreeDataGridSource Source { get; } [ObservableProperty] private string _selectedDrive; - [ObservableProperty] private string? _selectedPath; + private string? _selectedPath; [ObservableProperty] private FileNodeViewModel? _root; + public string? SelectedPath + { + get => _selectedPath; + set => SetSelectedPath(value); + } + partial void OnSelectedDriveChanged(string value) { Root = new FileNodeViewModel(value, true, true); @@ -31,11 +37,6 @@ public partial class FilesPageViewModel : ObservableObject } } - partial void OnSelectedPathChanged(string? value) - { - SetSelectedPath(value); - } - public FilesPageViewModel() { Drives = DriveInfo.GetDrives().Select(x => x.Name).ToList(); @@ -48,7 +49,7 @@ public partial class FilesPageViewModel : ObservableObject SelectedDrive = Drives.FirstOrDefault() ?? "/"; } - Source = new HierarchicalTreeDataGridSource(Array.Empty()) + Source = new HierarchicalTreeDataGridSource([]) { Columns = { @@ -108,16 +109,14 @@ public partial class FilesPageViewModel : ObservableObject foreach (var i in e.SelectedItems) Trace.WriteLine($"Selected '{i?.Path}'"); } - - private void SetSelectedPath(string? value) + private void SetSelectedPath(string? path) { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(path)) { Source.RowSelection!.Clear(); return; } - var path = value; var components = new Stack(); DirectoryInfo? d = null; @@ -148,7 +147,7 @@ public partial class FilesPageViewModel : ObservableObject if (driveIndex >= 0) SelectedDrive = Drives[driveIndex]; - FileNodeViewModel? node = _root; + var node = Root; index = new IndexPath(0); while (node is not null && components.Count > 0) @@ -162,7 +161,7 @@ public partial class FilesPageViewModel : ObservableObject } } - Source.Items = [Root]; + Source.Items = [Root!]; Source.RowSelection!.SelectedIndex = index; } } @@ -275,8 +274,8 @@ public partial class FileNodeViewModel : ObservableObject, IEditableObject }; } - void IEditableObject.BeginEdit() => _undoName = _name; - void IEditableObject.CancelEdit() => _name = _undoName!; + void IEditableObject.BeginEdit() => _undoName = Name; + void IEditableObject.CancelEdit() => Name = _undoName ?? string.Empty; void IEditableObject.EndEdit() => _undoName = null; private void OnChanged(object sender, FileSystemEventArgs e) diff --git a/src/Semi.Avalonia.TreeDataGrid/TreeDataGrid.axaml b/src/Semi.Avalonia.TreeDataGrid/TreeDataGrid.axaml index 845ed27..615412e 100644 --- a/src/Semi.Avalonia.TreeDataGrid/TreeDataGrid.axaml +++ b/src/Semi.Avalonia.TreeDataGrid/TreeDataGrid.axaml @@ -1,7 +1,8 @@ + xmlns:conv="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls.TreeDataGrid" + x:CompileBindings="True">