DataTemplateSelector
の中でを使用していContentControl
ます。私は3つの異なるDataTemplates
に基づいて3つの異なるを持っていobject types
ます。上記のタイプのデータにcontent
myを設定すると、特定のデータへのスワップが行われ、さらにセレクターが古いテンプレートから値をロールバック/リセットするように見えます。どうしてこんなことに?ContentControl
DataTemplateSelector
DataTemplate
編集: Prop という名前の添付プロパティがあり、その OnPropertyChangedCallback 内で、DataTemplate 間のスワップ時に値が null である Prop について通知されるため、値がリセットされることがわかりました。以下のコードでその添付プロパティを確認できます。
のこのスワッピングメカニズムの背後で何が起こっているのか、誰か助けてもらえますかDataTemplateSelector
?
コードを使用した詳細な説明は次のとおりです。
public void Window1()
{
InitalizeComponents();
}
public void OnClick(object sender, RoutedEventArgs e)
{
if(this.DataContext == null)
this.DataContext = "Hallo";
else{
if(this.DataContext is string)
this.DataContext = 123;
else{
if(this.DataContext is int)
this.DataContext = null;
}
}
}
By clicking on Button few times I change the type and so in ContentControl the selector changes to DataTemplate.
セレクターは以下のようになります。とtextDataTemplate
とnumericDataTemplate
もう 1 つのテンプレートを切り替えます。私が述べたように、私は言及したくない 、 、string
のint
3つのタイプを持っています。and one more
それらDataTemplates
は と呼ばれtextDataTemplate
、numericDataTemplate
もう 1 つです。:)
<local:MyTemplateSelector x:Key="dataTemplateSelector"
TextTemplate="{StaticResource textDataTemplate}"
NumericTemplate="{StaticResource numericDataTemplate}"/>
public class MyTemplateSelector : DataTemplateSelector
{
public DataTemplate TextTemplate;
public DataTemplate NumericTemplate;
public DataTemplate Select(object item, Culture.....)
{
if(item is string)
{
return this.TextTemplate;
}
else
{
return this.NumericTemplate;
}
}
}
ContentControl
XAML は次のようになります。
<Button Click="OnClick" Content="Click Me"/>
<ContentControl Name="contentCtrl"
Content="{Binding}"
Width="123"
ContentTemplateSelector="{StaticResource dataTemplateSelector}" />
そして、これがtextDataTemplate
似ている方法です。
<DataTemplate x:Key="textDataTemplate">
<TextBox x:Name="text" my:AttProperties.Prop="{extension:MarkupExt value}" Text="{Binding Path=Txt, Mode=Default, UpdateSourceTrigger=Explicit}"/>
</DataTemplate>
numericDataTemplate
textDataTemplate
数字のみが許可されているという点だけに似ています。
はProp
私のattached property
からAttProperties class
の ですtype string
。はProp
、3 つの DataTemplate すべての内部にあります。上は上にProp
座っていますTextBox
が、それも上にある可能性がありLabel
ます。はmarkupextension
単なる「return Hello」です。拡張機能は、カスタム マークアップ拡張機能の作成方法をテストするためのものです。拡張子に大した問題はありません。のスワッピングとはあまり関係がないはずですDataTemplates
。
私の問題を説明するためにもう一度。スワップすると、古いテンプレートが再設定/ロールバックされるようです。私は textDataTemplate から numericDataTemplate と言うことができ、textDataTemplate の Prop は null に設定されますが、以前の値は "Hello" でした。
なぜそれが起こっているのですか?を使用した場合と同じ動作のようtiggers
です。aTrigger
が無効になると、使用された値がロールバックされます。はDataTemplateSelector
と同じメカニズムを使用していTriggers
ますか?
編集済み:添付プロパティは、OnPropertyChangedCallback を使用した単純な .RegisterAttached です。OnPropertyChangedCallback 内では、dataTemplates を交換するときにプロップが null であることがわかりました。