Wpf wp使用绑定的ConverterParameter创建转换器

Wpf wp使用绑定的ConverterParameter创建转换器,wpf,binding,parameters,converter,Wpf,Binding,Parameters,Converter,我在这篇文章中看到了一个完全符合我需要的解决方案 但我真的不知道如何正确地实施它 我现在有一个PositionConverter,它在字符串中转换坐标,但我想通过它的参数传递其父对象(画布)的实际宽度 我的ConverterHelper必须实现IValueConverter和DependencyObject还是仅实现DependencyObject 我有点迷路了….您所需要的最好是通过IMultiValueConverter和MultiBinding来实现: public class Posit

我在这篇文章中看到了一个完全符合我需要的解决方案

但我真的不知道如何正确地实施它

我现在有一个PositionConverter,它在字符串中转换坐标,但我想通过它的参数传递其父对象(画布)的实际宽度

我的ConverterHelper必须实现IValueConverter和DependencyObject还是仅实现DependencyObject


我有点迷路了….

您所需要的最好是通过
IMultiValueConverter
MultiBinding
来实现:

public class PositionConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var scale = (double)values[0]; // this is your [0, 1] double
        var max = (double)values[1]; // this is the ActualWidth
        return scale * max;
    }
}
绑定看起来像:

<Element.Property>
    <MultiBinding Converter="{StaticResource myConverter}">
        <Binding Path="path_to_the_original_double" />
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorLevel=1}"
                 Path="ActualWidth" />
    </MultiBinding>
</Element.Property>


首先告诉我们为什么要将
实际宽度作为参数传递。提示:在几乎所有情况下,您都可以简单地使用
MultiBinding
代替
Binding
,使用
IMultiValueConverter
代替简单的
IValueConverter
。这将允许您传入任意多个绑定值。我想要的是将0和1之间的double转换为表示0和父级ActualWidth之间的double的字符串。这就是我现在所想的,使用您以前的注释。我马上就去试试!谢谢你的帮助^^最后一个问题,转换为字符串的位置用于设置元素的Canvas.Left和Top属性,我可以用鼠标拖动。因此,0到1属性的绑定是双向的。但是对ActualWidth的绑定是单向的,我应该如何实现ConvertBack来管理它?因为ConvertBack应该获得Canvas.Left属性和Double.Parse属性,然后将其除以ActualWidth属性,但在ConvertBack中,如果我是正确的,我无法访问它…@Julien:双向转换将不起作用,因为在
ConvertBack
中,您无法访问父级(及其
ActualWidth
)除非你愿意做可怕的黑客。在这种情况下,最好将对象包装在ViewModels中,并将转换逻辑放在其中(将值作为属性公开)。另一个问题是^^现在我无法将实际值传递给VM,因为它是只读属性,并且不可能对其进行绑定,即使它是单向源绑定。这是一个来自微软的bug knwon,现在我正在寻找一个解决方法。我已经找到了一种方法来处理我的问题,使用ActualWidth ant,效果很好!!我现在可以继续了。谢谢你的关心:)