2017-10-31 22 views
1

바운드 속성 중 하나를 수정해야합니다. DataTemplate. 이 템플릿 (중요한 부분 만)과 같이 정의된다 : DataTemplateSelector의 데이터 바인딩 변경

<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> 

은 조건에 따라, I는 다른 속성 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 생성 . 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

1

LoadContent() 메서드는 템플릿에 정의한 Image 요소의 인스턴스를 만듭니다. 그런 다음이 특정 인스턴스의 속성을 설정하고 XAML에서 정의한 수정되지 않은 템플릿을 반환합니다. SelectTemplate 메서드에서 수정 한 Image 요소는 즉시 가비지 수집 대상이되며 절대로 사용되지 않습니다.

이 방법은 작동하지 않습니다. 메소드와 완전히 다른 DataTemplate을 리턴해야합니다. DataTemplate을 다른 것으로 설정할 수 없습니다. XAML에서 DataTemplate을 제거하고 을 사용하면 DataTemplateSelector에 동적으로 DataTemplate을 생성 할 수 있습니다. 예를 들어 여기 내 대답을 확인하십시오

Combining DataTemplates at runtime

현재 접근 템플릿을 적용하고 결과를 버린다.

+0

흠 ... 말이 되네. 제 생각에'LoadContent()'는'DT' 객체 (*'XmlDocument'의'Load'와 비슷합니다) 안에 * 내용을로드합니다. 분명히 나는 ​​틀렸다. 지금은 두 개의 동일한 'DataTemplate'을 XAML 내에서 정의했으며이 속성은 하나의 속성 만 다릅니다. 나는 조건에 따라 적절한 것을 반환한다. 귀하의 의견을 보내 주셔서 감사합니다. – dotNET