This commit is contained in:
Dan Clark
2024-11-24 21:17:52 +00:00
parent d893335195
commit 93e2be4eb0
7 changed files with 69 additions and 27 deletions
+2 -2
View File
@@ -612,11 +612,11 @@ public partial class ObservableCollection<TValue, TViewModel> :
Value = value; Value = value;
} }
protected virtual void OnChanged(TValue? value) protected virtual void Changed(TValue? value)
{ {
} }
partial void OnValueChanged(TValue? value) => OnChanged(value); partial void OnValueChanged(TValue? value) => Changed(value);
} }
public partial class ObservableCollection<TKey, TValue, TViewModel> : public partial class ObservableCollection<TKey, TValue, TViewModel> :
+33 -13
View File
@@ -1,28 +1,46 @@
using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.DependencyInjection;
namespace Toolkit.Foundation; namespace Toolkit.Foundation;
public partial class ObservableConfiguration<TConfiguration, TValue>(IServiceProvider provider, public partial class ObservableConfiguration<TConfiguration, TValue> :
IServiceFactory factory, Observable<TValue>,
IMessenger messenger, IRecipient<ChangedEventArgs<TConfiguration>>
IDisposer disposer,
TConfiguration configuration,
IWritableConfiguration<TConfiguration> writer,
Func<TConfiguration, TValue?> read,
Action<TValue?, TConfiguration> write) :
Observable<TValue>(provider, factory, messenger, disposer),
IHandler<ChangedEventArgs<TConfiguration>>
where TConfiguration : class where TConfiguration : class
{ {
public void Handle(ChangedEventArgs<TConfiguration> args) private readonly TConfiguration configuration;
private readonly IWritableConfiguration<TConfiguration> writer;
private readonly Func<TConfiguration, TValue?> read;
private readonly Action<TValue?, TConfiguration> write;
private readonly IDispatcher dispatcher;
public ObservableConfiguration(IServiceProvider provider,
IServiceFactory factory,
IMessenger messenger,
IDisposer disposer,
TConfiguration configuration,
IWritableConfiguration<TConfiguration> writer,
Func<TConfiguration, TValue?> read,
Action<TValue?, TConfiguration> write,
TValue? value = default) : base(provider, factory, messenger, disposer)
{
this.configuration = configuration;
this.writer = writer;
this.read = read;
this.write = write;
dispatcher = provider.GetRequiredService<IDispatcher>();
}
public void Receive(ChangedEventArgs<TConfiguration> args)
{ {
if (args.Sender is TConfiguration configuration) if (args.Sender is TConfiguration configuration)
{ {
Value = read(configuration); dispatcher.Invoke(() => Value = read(configuration));
} }
} }
protected override void Activated() => Value = read(configuration); protected override void Activated() => dispatcher.Invoke(() => Value = read(configuration));
protected override void Changed(TValue? value) protected override void Changed(TValue? value)
{ {
@@ -30,5 +48,7 @@ public partial class ObservableConfiguration<TConfiguration, TValue>(IServicePro
{ {
writer.Write(args => write(value, args)); writer.Write(args => write(value, args));
} }
base.Changed(value);
} }
} }
@@ -1,10 +1,11 @@
using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.DependencyInjection;
namespace Toolkit.Foundation; namespace Toolkit.Foundation;
public partial class ObservableConfigurationCollection<TConfiguration, TValue, TViewModel> : public partial class ObservableConfigurationCollection<TConfiguration, TValue, TViewModel> :
ObservableCollection<TValue, TViewModel>, ObservableCollection<TValue, TViewModel>,
IHandler<ChangedEventArgs<TConfiguration>> IRecipient<ChangedEventArgs<TConfiguration>>
where TConfiguration : class where TConfiguration : class
where TViewModel : notnull, where TViewModel : notnull,
IDisposable IDisposable
@@ -13,6 +14,7 @@ public partial class ObservableConfigurationCollection<TConfiguration, TValue, T
private readonly Func<TConfiguration, TValue?> read; private readonly Func<TConfiguration, TValue?> read;
private readonly Action<TValue?, TConfiguration> write; private readonly Action<TValue?, TConfiguration> write;
private readonly IWritableConfiguration<TConfiguration> writer; private readonly IWritableConfiguration<TConfiguration> writer;
private readonly IDispatcher dispatcher;
public ObservableConfigurationCollection(IServiceProvider provider, public ObservableConfigurationCollection(IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
@@ -29,6 +31,7 @@ public partial class ObservableConfigurationCollection<TConfiguration, TValue, T
this.read = read; this.read = read;
this.write = write; this.write = write;
dispatcher = provider.GetRequiredService<IDispatcher>();
Value = value; Value = value;
} }
@@ -48,29 +51,27 @@ public partial class ObservableConfigurationCollection<TConfiguration, TValue, T
this.read = read; this.read = read;
this.write = write; this.write = write;
dispatcher = provider.GetRequiredService<IDispatcher>();
Value = value; Value = value;
} }
public void Handle(ChangedEventArgs<TConfiguration> args) public void Receive(ChangedEventArgs<TConfiguration> args)
{ {
if (args.Sender is TConfiguration configuration) if (args.Sender is TConfiguration configuration)
{ {
Value = read(configuration); dispatcher.Invoke(() => Value = read(configuration));
} }
} }
protected override void Activated() protected override void Activated() => dispatcher.Invoke(() => Value = read(configuration));
{
Value = read(configuration);
}
protected override void OnChanged(TValue? value) protected override void Changed(TValue? value)
{ {
if (IsActive) if (IsActive)
{ {
writer.Write(args => write(value, args)); writer.Write(args => write(value, args));
} }
base.OnChanged(value); base.Changed(value);
} }
} }
@@ -0,0 +1,21 @@
using Microsoft.UI.Xaml;
using System;
namespace Toolkit.UI.WinUI;
public class BoolToVisibilityConverter :
ValueConverter<bool, Visibility>
{
public Visibility TrueValue { get; set; } = Visibility.Visible;
public Visibility FalseValue { get; set; } = Visibility.Collapsed;
protected override Visibility ConvertTo(bool value,
Type? targetType,
object? parameter,
string? language)
{
_ = bool.TryParse(value.ToString(), out bool parsed);
return parsed ? TrueValue : FalseValue;
}
}
@@ -3,7 +3,7 @@ using Toolkit.Foundation;
namespace Toolkit.UI.WinUI; namespace Toolkit.UI.WinUI;
public class ValidationBooleanConverter : public class ValidationToBoolConverter :
ValueConverter<IReadOnlyIndexDictionary<string, string>, bool> ValueConverter<IReadOnlyIndexDictionary<string, string>, bool>
{ {
public string? Property { get; set; } public string? Property { get; set; }
@@ -3,7 +3,7 @@ using Toolkit.Foundation;
namespace Toolkit.UI.WinUI; namespace Toolkit.UI.WinUI;
public class ValidationMessageConverter : public class ValidationToMessageConverter :
ValueConverter<IReadOnlyIndexDictionary<string, string>, string?> ValueConverter<IReadOnlyIndexDictionary<string, string>, string?>
{ {
public string? Property { get; set; } public string? Property { get; set; }