更改 DataTemplateSelector 中的数据绑定

Changing data binding in DataTemplateSelector

我需要修改 DataTemplate 中的绑定属性之一。模板定义如下(仅相关部分):

<DataTemplate x:Key="MyImageTemplate">
  <Image>
    <Image.Source>
      <MultiBinding Converter="{StaticResource MyImageConverter}">
        <Binding Path="Source" />
        <Binding Path="TransparencyColor" />
        <Binding Path="TransparencyTolerance" />
      </MultiBinding>
    </Image.Source>
  </Image>
</DataTemplate>

根据条件,我需要将第一个绑定从 Source 更改为另一个 属性 Source2。下午的大部分时间都花在了这个上面,我无法为我的 DataTemplateSelector 工作编写以下简单代码:

Public Class MyDataTemplateSelector
  Inherits DataTemplateSelector

  Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
    Dim DT = DirectCast(Application.Current.FindResource("MyImageTemplate"), DataTemplate)
    Dim Control = DirectCast(DT.LoadContent(), FrameworkElement)

    Dim MB = BindingOperations.GetMultiBinding(item, System.Windows.Controls.Image.SourceProperty)
    Dim Source2Binding As New Binding(NameOf(ImageVM.Source2))

    Dim MB2 As New MultiBinding With {.Converter = MB.Converter}
    MB2.Bindings.Add(Source2Binding)
    MB2.Bindings.Add(MB.Bindings(1))
    MB2.Bindings.Add(MB.Bindings(2))

    Control.SetBinding(System.Windows.Controls.Image.SourceProperty, MB2)

    Return DT
  End Function
End Class

我已经确认它甚至没有将这个新创建的 MultiBinding 分配给图像的来源 属性。我做错了什么?

LoadContent() 方法创建您在模板中定义的 Image 元素的实例。然后,您将设置此特定实例的属性和 return 您在 XAML 中定义的未修改模板。您在 SelectTemplate 方法中修改的 Image 元素将立即符合垃圾回收条件,并且永远不会被使用。

所以这个方法行不通。您需要 return 一个完全不同于 DataTemplate 的方法。您不能将 DataTemplate 基于另一个。您不妨从 XAML 中删除 DataTemplate,并使用 XamlReader.ParseDataTemplateSelector 中动态创建 DataTemplate。在这里查看我的答案示例:

您当前的方法应用模板并丢弃结果。