【问题标题】:Access to bound data in IMultiValueConverter.ConvertBack() in C#/WPF在 C#/WPF 中访问 IMultiValueConverter.ConvertBack() 中的绑定数据
【发布时间】:2010-04-17 00:11:16
【问题描述】:

我遇到了多重绑定问题:

<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 需要所有绑定值。这在 Convert() 中效果很好。换一种方式,myConverter 应该理想地计算 Slope 值(其余的为 Binding.DoNothing),但除了传递给 ConvertBack() 的 Canvas.Top 之外,它还需要其他值。解决这个问题的正确方法是什么?

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

【问题讨论】:

    标签: c# wpf data-binding xaml


    【解决方案1】:

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

    让你的转换器派生自FrameworkContentElement。定义多个DependencyProperty 属性。您需要的数量与转换两端所需的值一样多。

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

    这种方法的奇怪之处在于您将拥有两个相同的绑定,一个在 XAML 的 &lt;MultiBinding&gt; 部分中,另一个在您定义转换器的 Resources 中。前者需要触发MultiBinding,后者实际提供ConvertBack方向的值。

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

    【讨论】:

    • 谢谢,这很有见地。它还提醒我,当事情变得复杂时,问题可能出在设计上。 :) 我可能会重新考虑我的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2011-03-01
    • 2022-09-23
    相关资源
    最近更新 更多