Во-первых, проблема в том, что конвертер не может наследовать DataContext там, где он находится, поэтому привязка не может работать: вы увидите «Ментор фреймворка не найден» в выходных данных VS, если вы поместите трассировку в привязка у вас есть (см. приложение A). Вот почему вы не можете просто извлечь из FrameworkElement и использовать RelativeSource={RelativeSource AncestorType=Whatever}
: вы находитесь вне визуального дерева. Там нет предков. Кроме того, даже если бы существовал наставник фреймворка, DependencyObject не может предоставить источник для привязки. Источник должен быть явным. Только классы, которые наследуются от FrameworkElement, могут наследовать DataContext.
Итак, я украл класс BindingProxy ( из этого ответа ) и использовал его для предоставления источника для привязки. Это немного неуклюже, но другой альтернативой, о которой я подумал, было наследование конвертера от Freezable, по сути, присвоение ему свойств BindingProxy и создание конвертера в ресурсах. Это сработало, но я предпочитаю, как это организовано.
public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
#region Data Property
public Object Data
{
get { return (Object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register(nameof(Data), typeof(Object), typeof(BindingProxy),
new PropertyMetadata(null));
#endregion Data Property
}
1009 * XAML *
<StackPanel.Resources>
<local:BindingProxy
x:Key="VMProxy"
Data="{Binding}"
/>
</StackPanel.Resources>
<TextBlock>
<TextBlock.Text>
<Binding Path="MyIntegerProperty">
<Binding.Converter>
<local:AddConverter
AddInteger="{Binding Data.MyAddIntegerProperty, Source={StaticResource VMProxy}}"
/>
</Binding.Converter>
</Binding>
</TextBlock.Text>
</TextBlock>
<Ч />
Приложение A
AddInteger="{Binding MyAddIntegerProperty, Mode=OneWay,
PresentationTraceSources.TraceLevel=High}"
System.Windows.Data Warning: 56 : Created BindingExpression (hash=14964341) for Binding (hash=21653700)
System.Windows.Data Warning: 58 : Path: 'MyAddIntegerProperty'
System.Windows.Data Warning: 60 : BindingExpression (hash=14964341): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=14964341): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=14964341): Attach to WpfApp2.AddConverter2.AddInteger (hash=57434139)
System.Windows.Data Warning: 64 : BindingExpression (hash=14964341): Use Framework mentor <null>
System.Windows.Data Warning: 67 : BindingExpression (hash=14964341): Resolving source
System.Windows.Data Warning: 69 : BindingExpression (hash=14964341): Framework mentor not found
System.Windows.Data Warning: 65 : BindingExpression (hash=14964341): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=14964341): Resolving source
System.Windows.Data Warning: 69 : BindingExpression (hash=14964341): Framework mentor not found