我需要修改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属性。我做错了什么?
答案 0 :(得分:1)
LoadContent()
方法创建您在模板中定义的Image
元素的实例。然后,您将设置此特定实例的属性,并返回您在XAML中定义的未修改模板。您在SelectTemplate
方法中修改的Image元素将立即有资格进行垃圾回收,永远不会被使用。
所以这种方法不起作用。您需要从方法中返回完全不同的DataTemplate
。您不能将DataTemplate
作为另一个。{1}}。您也可以从XAML中删除DataTemplate
并使用XamlReader.Parse在DataTemplate
中动态创建DataTemplateSelector
。点击这里查看我的答案:
Combining DataTemplates at runtime
您当前的方法适用模板并丢弃结果。