public ViewModelBinding(ConsoleControl control, PropertyInfo controlProperty, ObservableObject viewModel, string observablePropertyName)
{
var viewModelObservableProperty = viewModel.GetType().GetProperty(observablePropertyName);
if (viewModelObservableProperty.PropertyType != controlProperty.PropertyType &&
viewModelObservableProperty.PropertyType.IsSubclassOf(controlProperty.PropertyType) == false &&
viewModelObservableProperty.PropertyType.GetInterfaces().Contains(controlProperty.PropertyType) == false)
{
throw new InvalidOperationException($"ViewModel property '{viewModel.GetType().FullName}.{observablePropertyName}' of type {viewModelObservableProperty.PropertyType.FullName} is not compatible with control property '{controlProperty.DeclaringType.FullName}.{controlProperty.Name}' of type {controlProperty.PropertyType.FullName} ");
}
viewModel.SynchronizeForLifetime(observablePropertyName, () =>
{
var newValue = viewModelObservableProperty.GetValue(viewModel);
if (newValue == latestValue) return;
latestValue = newValue;
controlProperty.SetValue(control, newValue);
}, control.LifetimeManager);
control.SubscribeForLifetime(controlProperty.Name, () =>
{
var newValue = controlProperty.GetValue(control);
if (newValue == latestValue) return;
latestValue = newValue;
viewModelObservableProperty.SetValue(viewModel, newValue);
}, control.LifetimeManager);
}