更改DataTemplateSelector

时间:2017-10-31 12:28:09

标签: wpf vb.net xaml data-binding datatemplate

我需要修改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>

根据条件,我需要将第一个绑定从来源更改为另一个属性 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分配给Image的Source属性。我做错了什么?

1 个答案:

答案 0 :(得分:1)

LoadContent()方法创建您在模板中定义的Image元素的实例。然后,您将设置此特定实例的属性,并返回您在XAML中定义的未修改模板。您在SelectTemplate方法中修改的Image元素将立即有资格进行垃圾回收,永远不会被使用。

所以这种方法不起作用。您需要从方法中返回完全不同的DataTemplate。您不能将DataTemplate作为另一个。{1}}。您也可以从XAML中删除DataTemplate并使用XamlReader.ParseDataTemplate中动态创建DataTemplateSelector。点击这里查看我的答案:

Combining DataTemplates at runtime

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