2017-10-31 18 views
1

バインドされたプロパティの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> 

が条件に応じて、私は別のプロパティ ソース2ソースから結合最初に変更する必要があります。私はそれもイメージのSourceプロパティに、この新しく作成された MultiBindingを割り当てていないことを確認しました

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 

:これで午後の大半を過ごした、私は私のDataTemplateSelector仕事の次の簡単なコードを作成することはできません。私は間違って何をしていますか?

答えて

1

LoadContent()メソッドは、テンプレートで定義したImage要素のインスタンスを作成します。この特定のインスタンスのプロパティを設定し、XAMLで定義した未修正のテンプレートを返します。 SelectTemplateメソッドで変更したImage要素は、すぐにガベージコレクションの対象となり、決して使用されません。

この方法は機能しません。このメソッドから完全に別のDataTemplateを返す必要があります。 DataTemplateを別のベースに置くことはできません。 XAMLからDataTemplateを取り除いてXamlReader.Parseを使用して、DataTemplateSelectorDataTemplateを動的に作成することもできます。例えばここに私の答えをチェックしてください:

Combining DataTemplates at runtime

あなたの現在のアプローチテンプレートを適用し、その結果を破棄します。

+0

Hmm ...意味があります。私の印象は、 'LoadContent()'が( 'XmlDocument'の' Load'と同じように) 'DT'オブジェクトの中に*のコンテンツをロードするという印象でした。明らかに私は間違っていた。今のところ私はXAML内に2つの同一の 'DataTemplate'を定義しました。私は条件に基づいて適切なものを返す。あなたのご意見ありがとうございます。 – dotNET

関連する問題