我正在使用DataTemplateSelector
内部 a ContentControl
。DataTemplates
基于 3 个不同,我有 3个不同object types
。当我将content
我ContentControl
的数据设置为上述类型的数据时,DataTemplateSelector
交换到特定DataTemplate
的和选择器似乎会回滚/重置旧模板中的值。为什么呢?
编辑:我发现这些值被重置了,因为我有一个名为 Prop 的附加属性,并且在它的 OnPropertyChangedCallback 内部它通知我在 DataTemplates 之间交换时 Prop 的值为 null。您可以在下面的代码中看到该附加属性。
有人可以帮我弄清楚这种交换机制背后发生了什么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
。位于所有三个 DataTemplate 内部的某个地方type string
。Prop
上面Prop
是坐在a上,TextBox
但也可能是a Label
。这markupextension
只是一个“回你好”。该扩展只是为了测试如何创建自定义标记扩展。扩展没什么大不了的。它不应该与交换DataTemplates
.
再来一次解释我的问题。交换似乎转售/回滚我的旧模板。我从 textDataTemplate 切换到 numericDataTemplate 并且 textDataTemplate 的 Prop 设置为 null 但之前的值是“Hello”。
为什么会这样?似乎与 using 的行为相同tiggers
。一旦 aTrigger
不再有效,它就会回滚使用的值。是否DataTemplateSelector
使用某种与 相同的机制Triggers
?
编辑:附加属性只是一个简单的 .RegisterAttached 与 OnPropertyChangedCallback。在 OnPropertyChangedCallback 中,我认为交换 dataTemplates 时道具为空。