Вот метод расширения, в котором вы устанавливаете значение для целевого объекта
public static void SetTargetValue<T>(this FrameworkElement element, DependencyProperty dp, T value)
{
var binding = BindingOperations.GetBinding(element, dp);
if (binding == null) return;
var name = binding.Path.Path;
var splits = name.Split('.');
var target = element.DataContext;
for (var i = 0; i < splits.Length; i++)
{
PropertyInfo property;
if (i == splits.Length - 1)
{
property = target.GetType().GetProperty(splits[i]);
property.SetValue(target, value);
}
else
{
property = target.GetType().GetProperty(splits[i]);
target = property.GetValue(target);
}
}
}
Итак, в этом методе, используя привязку, вы можете установить значение для источника. Конечно, у Path Path может быть много имен - Property1.Property2.Property3 и т. Д.
В принудительном методе вам нужно только вызвать этот метод:
private static object CoerceProperty(DependencyObject d, object baseValue)
{
if (!Check)
{
var sender = (FrameworkElement)d;
sender.SetTargetValue(MyPropertyProperty, myValue);
return needValue;
}
return baseValue;
}