Я использую DataTemplateSelector
внутри ContentControl
. У меня 3 разных DataTemplates
на основе 3 разных object types
. Когда я устанавливаю из моих ContentControl
в данные указанных типов, DataTemplateSelector
свопирует к определенному DataTemplate
И, наоборот, селектор, похоже, откатывает/перезапускает значения из старого шаблона. Почему это так?DataTemplateSelector и его странное поведение
Edit: Я понял, что значения получают сброшены, потому что у меня есть вложенное свойство caled Prop и внутри его OnPropertyChangedCallback он уведомляет меня о Prop, имеющий нулевое значение на обмен между DataTemplates. Вы можете увидеть это прикрепленное свойство в коде ниже.
Может кто-нибудь помочь мне в том, что происходит за этим механизмом обмена 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
и еще одним шаблоном. Как я уже упоминал, у меня есть те три типа, которые являются string
, int
, and one more
, что я не хочу отмечать. Их DataTemplates
называются textDataTemplate
, numericDataTemplate
и еще один. :)
<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
находится где-то внутри всех трех DataTemplate. Над Prop
сидит на TextBox
, но это может быть и Label
. markupextension
- всего лишь "return Hello". Расширение просто для проверки того, как создать пользовательское расширение разметки. Нет большой сделки с расширением. Это не должно многое сделать с заменой DataTemplates
.
Еще один раз, чтобы объяснить мою проблему. Swapping, похоже, перепродает/откатывает старые шаблоны. Я заменяю textDataTemplate, чтобы сказать, что numericDataTemplate и Prop of textDataTemplate получает значение null, но значение before было «Hello».
Почему это происходит? Похоже, что с использованием tiggers
. Как только Trigger
недействителен, он откатывает использованные значения. Является DataTemplateSelector
, используя какой-то такой же механизм, как Triggers
?
Edited: Прилагаемый свойство только простой .RegisterAttached с OnPropertyChangedCallback. Внутри OnPropertyChangedCallback я понял, что prop имеет значение null при замене dataTemplates.
Есть ли у вас какие-либо конкретные проблемы или это просто хочу знать "вопрос? – DHN
Можете ли вы разместить шаблон и посмотреть, пожалуйста? ИМХО Я не думаю, что «Шаблон» воссоздается снова и снова. – DHN
Я отредактировал мой вопрос с кодом и более объяснением. –