Это попытка слишком растянуть структуру IValueConverter
- вы могли бы сделать так, чтобы ваши конвертеры реализовали DependencyObject
, чтобы разрешить связывание, но я думаю, что вы столкнетесь с проблемами, вызвав их запуск из-за того, как они создаются изxaml.
Я бы порекомендовал пакет nuget Microsoft.Xaml.Behaviors.Wpf - это позволяет подключать Behavior
экземпляров, которые уже расширяют DependencyObject
и поддерживают привязку изкоробка.После того, как привязка сработает, вы можете установить Content
на ContentControl
, к которому вы привязаны, с помощью любой логики, которую вы хотите.
Например:
public class NodeToViewModelBehavior : Behavior<ContentControl>
{
public static readonly DependencyProperty NodeProperty = DependencyProperty.Register("Node", typeof(object), typeof(NodeToViewModelBehavior), new FrameworkPropertyMetadata(PropertyChangedCallback));
public object Node
{
get { return (object) GetValue(NodeProperty); }
set { SetValue(NodeProperty, value); }
}
private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var nodeToViewModelBehavior = (NodeToViewModelBehavior)d;
var newNode = e.NewValue;
nodeToViewModelBehavior.SetContent(newNode);
}
private void SetContent(object newNode)
{
var convertedObject = newNode; // insert logic here to grab whatever data you need
this.AssociatedObject.Content = convertedObject;
}
}
И использование в xaml следующим образом:
<ContentControl>
<i:Interaction.Behaviors>
<local:NodeToViewModelBehavior Node="{Binding SelectedNode}"/>
</i:Interaction.Behaviors>
</ContentControl>
где пространство имен i объявлено как
xmlns:i="clr-namespace:Microsoft.Xaml.Behaviors;assembly=Microsoft.Xaml.Behaviors"