Связывание в конвертере? - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь создать пользовательский конвертер, который наследует от 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>

Я что-то упускаю?

Ответы [ 3 ]

1 голос
/ 29 марта 2012

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

  • возможно, вам придется наследовать от FrameworkElement, а не IValueConverter, Примерно так:

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

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

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

0 голосов
/ 28 марта 2012

Внимание! Привязка 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();
}

}

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

...