using KGySoft.CoreLibraries;
using KGySoft.ComponentModel;
private class TestClass : ObservableObjectBase
public string TestProp { get => Get<string>(); set => Set(value); }
public static readonly ICommand LogPropChangeCommand = new SourceAwareTargetedCommand<PropertyChangedExtendedEventArgs, TextWriter>((src, state, writer) =>
writer.WriteLine($"{src.EventArgs.PropertyName}: {src.EventArgs.OldValue} -> {src.EventArgs.NewValue}");
state.AsDynamic.TriggerCount = state.GetValueOrDefault<int>("TriggerCount") + 1;
public static void Main()
var test = new TestClass();
ICommandBinding binding = LogPropChangeCommand.CreateBinding(test, "PropertyChanged", Console.Out);
Assert.IsFalse(binding.State.ContainsKey("TriggerCount"));
Assert.AreEqual(2, binding.State.AsDynamic.TriggerCount);
Assert.AreEqual(2, binding.State.AsDynamic.TriggerCount);
binding = LogPropChangeCommand.CreateBinding()
.AddSource(test, "PropertyChanged")
Assert.IsFalse(binding.State.ContainsKey("TriggerCount"));
Assert.AreEqual(1, binding.State.AsDynamic.TriggerCount);
binding.InvokeCommand("Fake sender", "Fake event name", new PropertyChangedExtendedEventArgs("old", "new", "Fake property name"));
Assert.AreEqual(2, binding.State.AsDynamic.TriggerCount);