diff --git a/Melskin/Controls/ListBox.xaml b/Melskin/Controls/ListBox.xaml index 98513f2..f29c0f9 100644 --- a/Melskin/Controls/ListBox.xaml +++ b/Melskin/Controls/ListBox.xaml @@ -118,10 +118,13 @@ + + - + + @@ -164,10 +169,32 @@ + + - + + + + + + + + + + + + + + diff --git a/Melskin/Utilities/RelayCommand.cs b/Melskin/Utilities/RelayCommand.cs index 82c1d78..7d4652d 100644 --- a/Melskin/Utilities/RelayCommand.cs +++ b/Melskin/Utilities/RelayCommand.cs @@ -7,13 +7,16 @@ namespace Melskin.Utilities; internal class RelayCommand : ICommand { private readonly Action execute; - + private readonly Predicate? _canExecute; /// /// 当命令的可执行状态更改时发生的事件。 /// 此事件通知UI,当命令的CanExecute方法返回值发生变化时,需要重新查询命令的状态。 /// - public event EventHandler? CanExecuteChanged; - + public event EventHandler? CanExecuteChanged + { + add => CommandManager.RequerySuggested += value; + remove => CommandManager.RequerySuggested -= value; + } /// /// 一个简单的ICommand实现,用于传递动作。此命令始终可以执行。 /// @@ -24,13 +27,18 @@ internal class RelayCommand : ICommand /// /// 传递给命令的参数。 /// 返回一个布尔值,指示命令是否能够执行。对于此实现,总是返回true。 - public bool CanExecute(object? parameter) => true; + public bool CanExecute(object? parameter) => _canExecute == null || _canExecute(parameter); /// /// 执行命令。 /// /// 传递给命令的参数。 public void Execute(object? parameter) => execute(parameter); + + /// + /// 通知命令管理器重新查询此命令的 CanExecute 状态。 + /// + public void RaiseCanExecuteChanged() => CommandManager.InvalidateRequerySuggested(); } /// @@ -66,7 +74,14 @@ internal class RelayCommand : ICommand /// /// 传递给命令的参数。 /// 返回一个布尔值,指示命令是否能够执行。对于此实现,总是返回true。 - public bool CanExecute(object? parameter) => canExecute == null || canExecute((T?)parameter); + public bool CanExecute(object? parameter) + { + if (canExecute == null) return true; + + // 使用安全的类型获取机制,防止 InvalidCastException + T? validParameter = GetSafeParameter(parameter); + return canExecute(validParameter); + } /// /// 执行命令。 @@ -74,13 +89,26 @@ internal class RelayCommand : ICommand /// 传递给命令的参数。 public void Execute(object? parameter) { - execute((T?)parameter); + T? validParameter = GetSafeParameter(parameter); + execute(validParameter); } /// /// 通知命令管理器重新查询此命令的CanExecute状态。 /// 此方法用于在命令执行条件可能已更改时更新UI。 /// - #pragma warning disable CS0067 public void RaiseCanExecuteChanged() => CommandManager.InvalidateRequerySuggested(); + /// + /// 安全地将 object 参数转换为泛型 T。如果类型不匹配,则返回 T 的默认值。 + /// + private static T? GetSafeParameter(object? parameter) + { + if (parameter is T tParam) + { + return tParam; + } + + // 应对 WPF 绑定时可能会传入 null 的情况,特别是在 T 为值类型时 + return default; + } } diff --git a/MelskinTest/MainWindow.xaml b/MelskinTest/MainWindow.xaml index bdbb8d7..43c361e 100644 --- a/MelskinTest/MainWindow.xaml +++ b/MelskinTest/MainWindow.xaml @@ -938,19 +938,23 @@ - - - - - - - - - + + + + + + + + + + diff --git a/ShrlAlgoToolkit.RevitAddins/Common/Converters/Rv2WinColorConverter.cs b/ShrlAlgoToolkit.RevitAddins/Common/Converters/Rv2WinColorConverter.cs index b73ed6a..2163a62 100644 --- a/ShrlAlgoToolkit.RevitAddins/Common/Converters/Rv2WinColorConverter.cs +++ b/ShrlAlgoToolkit.RevitAddins/Common/Converters/Rv2WinColorConverter.cs @@ -12,13 +12,11 @@ namespace ShrlAlgoToolkit.RevitAddins.Common.Converters; /// public class Rv2WinColorConverter : IValueConverter { - public static Rv2WinColorConverter Instance { get; } = new Rv2WinColorConverter(); + public static readonly Rv2WinColorConverter Instance = new(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var color = (Autodesk.Revit.DB.Color)value; - //if (Autodesk.Revit.DB.SelectedColor.InvalidColorValue) - //{ - //} + if (color is { IsValid: true }) { var rgb = Color.FromRgb(color.Red, color.Green, color.Blue);