gpt4 book ai didi

c# - 在 C#/WPF 中访问 IMultiValueConverter.ConvertBack() 中的绑定(bind)数据

转载 作者:行者123 更新时间:2023-11-30 22:46:25 24 4
gpt4 key购买 nike

我有一个多重绑定(bind)的问题:

<Canvas>
<local:SPoint x:Name="sp" Width="10" Height="10">
<Canvas.Left><!-- irrelevant binding here --></Canvas.Left>
<Canvas.Top>
<MultiBinding Converter="{StaticResource myConverter}" Mode="TwoWay">
<Binding ElementName="cp1" Path="(Canvas.Top)"/>
<Binding ElementName="cp1" Path="Height"/>
<Binding ElementName="cp2" Path="(Canvas.Top)"/>
<Binding ElementName="cp2" Path="Height"/>
<Binding ElementName="sp" Path="Height"/>
<Binding ElementName="sp" Path="Slope" Mode="TwoWay"/>
</MultiBinding>
</Canvas.Top>
</local:SPoint>
<local:CPoint x:Name="cp1" Width="10" Height="10" Canvas.Left="20" Canvas.Top="150"/>
<local:CPoint x:Name="cp2" Width="10" Height="10" Canvas.Left="100" Canvas.Top="20"/>
</Canvas>

为了计算 Canvas.Top 值,myConverter 需要所有绑定(bind)值。这在 Convert() 中非常有效。另一方面,myConverter 应该理想地计算斜率值(其余为 Binding.DoNothing),但除了传递给 ConvertBack() 的 Canvas.Top 之外,它还需要其他值。解决这个问题的正确方法是什么?

我已尝试进行绑定(bind) OneWay 并为 local:SPoint.Slope 创建一个额外的多重绑定(bind),但这会导致无限递归和堆栈溢出。我以为可以使用 ConverterParameter,但似乎无法绑定(bind)到它。

最佳答案

该方法可能不是最优雅的方法,但它确实解决了多重绑定(bind)的限制以及 ConverterParameter 的事实。不是 DependencyProperty .

使您的转换器派生自 FrameworkContentElement .定义一个数字 DependencyProperty属性。您需要的数量与转换两端所需的值(value)一样多。

由于您的转换器通常位于 XAML 资源中,DataContextElementName没有来自 DataContextSpy 的帮助,绑定(bind)将无法工作和/或 ElementSpy ,具体取决于您的特定绑定(bind)需求。

这种方法的奇怪之处在于您将有两个相同的绑定(bind),一个在 <MultiBinding> 中。 XAML 部分和 Resources 中的另一个部分您定义转换器的位置。前者需要触发 MultiBinding而后者实际上提供了 ConvertBack 中的值方向。

缺点是资源是共享的,因此如果您在页面的其他地方需要相同的功能转换器,您可能需要在您的资源中声明第二个。这仅当两个 MultiBinding需要不同的参数。如果共享参数,您也可以使用相同的资源。您也可以尝试 x:Shared="False"在转换器资源上,但我不确定这是否可行。

关于c# - 在 C#/WPF 中访问 IMultiValueConverter.ConvertBack() 中的绑定(bind)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com