При установке привязки на Setter вам вообще не нужны операции BindingOperation.Все, что вам нужно сделать, это:
var setter = new Setter(TextBlock.TextProperty, new Binding("FirstName"));
или эквивалентно
var setter = new Setter
{
Property = TextBlock.TextProperty,
Value = new Binding("FirstName"),
};
, любой из них будет эквивалентен
<Setter Property="TextBlock.Text" Value="{Binding FirstName}" />
Причина, по которой это работает, заключается в том, что Setter.Value - это обычное свойство CLR, а не DependencyProperty, и поэтому оно не может быть связано.Таким образом, нет никакой двусмысленности ни в XAML, ни в коде, когда вы сохраняете в нем объект Binding.
Когда метод Set фактически применяется к объекту, если в Setter обнаружен Binding, эквивалент BindingOperations.SetBinding называется.В противном случае свойство устанавливается напрямую.