0

Я пытаюсь сделать пользовательский конвертер, который наследуется от DependencyObject, но он не работает:Связывание в конвертере?

Преобразователь:

public class BindingConverter : DependencyObject , IValueConverter 
{ 
    public object Value 
    { 
    get { return (object)GetValue(ValueProperty); } 
    set { SetValue(ValueProperty, value); } 
    } 
    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(object), typeof(BindingConverter), new PropertyMetadata(null)); 


    public object Convert(object value, Type targetType, object parameter, Globalization.CultureInfo culture) 
    { 
    Debug.Assert(Value != null); //fails 
    return Value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, Globalization.CultureInfo culture) 
    { 
    throw new NotImplementedException(); 
    } 
} 

Xaml:

<StackPanel x:Name="this"> 
    <!--works--> 
    <ContentControl Content="{Binding ActualHeight, ElementName=this}"/> 
    <!--doesn't work--> 
    <ContentControl> 
    <Binding> 
     <Binding.Converter> 
     <BindingConverter Value="{Binding ActualHeight, ElementName=this}" /> 
     </Binding.Converter> 
    </Binding> 
    </ContentControl> 
    <TextBlock Text="{Binding Animals}"/> 
</StackPanel> 

Я пропускаю что-нибудь ?

ответ

1

У меня есть некоторые места в моих проектах, где мне нужна была аналогичная функциональность. Не могу показать вам точный образец, просто идея:

  • , возможно, вы должны наследовать от FrameworkElement, не IValueConverter, что-то вроде этого:

    public class BindingHelper : FrameworkElement  
    
  • в классе BindingHelper, установить видимость Collapsed и IsHitTestVisible - false;

  • , чтобы заставить его работать, вставить его непосредственно в визуальное дерево. В вашем примере это должно быть дочерним элементом StackPanel. Таким образом, он будет иметь тот же DataContext, что и другие дети StackPanel;
  • Затем вы можете добавить одну или более зависимых свойств в зависимости от ваших потребностей. Например, у вас может быть одно свойство источника данных и некоторые другие свойства, которые вы затем будете использовать в качестве значений возврата преобразователя. Обработать все изменения исходного свойства в вашем классе BindingHelper и соответственно изменить свойства вывода;
  • связать другие элементы управления свойствами класса BindingHelper используя ElementName синтаксис
0

Примечание! ActualHeight Переплет собственности является ошибкой при привязке!

Почему вы наследуете DependencyObject при кодировании конвертера? Вы должны просто реализовать IValueConverter.

Попробуйте, что

Сначала добавьте MyConverter по ключу «MyConverterResource» на ваших ресурсах тогда, Вы можете сделать, чем на XAML стороне или на CS бок

//You may do it on XAML side <UserControl.Resources>... 
this.Resources.Add("MyConverterResource",new MyConverter()); 

<TextBlock Text="{Binding ActualHeight,ElementName=this 
,Converter=MyConverterResource}"/> 

public class MyConverter: IValueConverter 
{ 

public object Convert(object value, Type targetType 
, object parameter,Globalization.CultureInfo culture) 
{ 

    return "Your Height is:"+Value.toString(); 
} 

} 

Надежда помогает

+0

прежде всего, извините за выбор ActualHeight/Ширина для моего примера. В моем реальном примере я пытаюсь реализовать конвертер, который имитирует функциональность WPF '{RelativeSource PreviuosData}'. Поэтому для этого я хочу перейти со ссылкой, ссылкой на коллекцию. Я пытался связать с '{Binding Converter = {PreviousDataConverter Collection = {Binding ItemsSource, ElementName = myItemsControl}}}'. – Shimmy

+0

Думаю, теперь у меня вопрос, вы пытаетесь показать текущие и предыдущие данные источника вместе с UI. Если я прав, вы можете достичь этой функции, используя параметр Converter. Раньше я не нуждался в этом feautre, но для некоторых преобразователей я передавал параметр для метода Convert для разных ответов. {Binding Source = itemssouce, converter = preconverter, converterparameter = {Binding ElementName = X, Path = index?}, ... что-то вроде этого? –

+0

Это наверняка не сработает, конвертер 'Parameter' не является связующим AFAIK. – Shimmy

0

в Silverlight, ActualHeight и ActualWidth свойства не содержат уведомлений о изменениях свойств. Таким образом, привязка к ним не будет работать.

+0

Прочтите мой комментарий о ответе Давута. – Shimmy

 Смежные вопросы

  • Нет связанных вопросов^_^