【问题标题】:Binding in Converter?在转换器中绑定?
【发布时间】:2012-04-11 14:35:03
【问题描述】:

我正在尝试制作一个继承自 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>

我错过了什么吗?

【问题讨论】:

    标签: silverlight xaml binding ivalueconverter dependencyobject


    【解决方案1】:

    我的项目中有一些地方需要类似的功能。无法向您展示确切的样本,只是一个想法:

    • 也许你必须从 FrameworkElement 继承,而不是 IValueConverter,像这样:

      public class BindingHelper : FrameworkElement    
      
    • 在 BindingHelper 类中,将 Visibility 设置为 Collapsed,将 IsHitTestVisible 设置为 false;

    • 要使其正常工作,请将其直接插入到可视化树中。在您的示例中,它应该是 StackPanel 的子级。因此,它将具有与其他 StackPanel 子项相同的 DataContext;
    • 然后,您可以根据需要添加一个或多个依赖项属性。例如,您可能具有数据源的单个属性和一些不同的属性,然后您将这些属性用作转换器返回值。处理 BindingHelper 类中源属性的所有更改,并相应地更改输出属性;
    • 使用 ElementName 语法将其他控件绑定到 BindingHelper 类的属性

    【讨论】:

      【解决方案2】:

      在 Silverlight 中,ActualHeight 和 ActualWidth 属性不会通知属性更新。所以,绑定到他们是行不通的。

      【讨论】:

        【解决方案3】:

        注意! ActualHeight 属性的绑定在绑定时出错!

        为什么在编写转换器时要继承DependencyObject?你应该只实现IValueConverter。

        试试看,

        首先通过“MyConverterResource”键在您的资源上添加MyConverter,然后, 您可以在 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();
        }
        
        }
        

        希望有帮助

        【讨论】:

        • 首先,很抱歉为我的示例选择 ActualHeight/Width。在我的真实示例中,我正在尝试实现一个模仿 WPF {RelativeSource PreviuosData} 功能的转换器。所以要做到这一点,我想与绑定一起传递对集合的引用。我尝试与{Binding Converter={PreviousDataConverter Collection={Binding ItemsSource, ElementName=myItemsControl}}} 绑定。
        • 我想我现在得到了问题,您尝试在 UI 上同时显示源的当前和以前的数据。如果我是对的,您可以通过使用 Converter 参数来实现此功能。我以前不需要这个功能,但是对于某些转换器,我在 Convert 方法上传递参数以获得不同的响应。 {Binding Source=itemssouce,converter=preconverter,converterparameter={Binding ElementName=X,Path=index?}, ... 像这样?
        • 这肯定行不通,Parameter 转换器不可绑定 AFAIK。
        • 我明白了,这是传递参数blog.andrew-veresov.com/post/Binding-a-Converter-Parameter.aspx的解决方案
        • 没有。我希望参数是绑定值,而不是静态资源。
        猜你喜欢
        • 1970-01-01
        • 2012-03-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2017-02-01
        相关资源
        最近更新 更多