我有以下XAML:
<Grid x:Name="root">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.Resources>
<DataTemplate DataType="{x:Type ViewModels:TemplateViewModel}">
<ContentControl Content="{Binding}" Grid.Row="0" x:Name="ct">
<ContentControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="Loaded" />
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding DataContext.State,
RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Value="2">
<Setter Property="ContentTemplate" TargetName="ct">
<Setter.Value>
<DataTemplate>
<TextBlock Text="Loading, please wait" Foreground="Red"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Grid.Resources>
<ContentControl Content="{Binding MainContent}" />
XAML位于Window元素中。我正在将Window绑定到具有两个属性State和MainContent:
的ViewModel对象public class ViewModel : INotifyPropertyChanged {
public int State {...} // this can be only 1 or 2, for simplicity
public TemplateViewModel MainContent { ... }
}
我相应地从属性设置器中引发了PropertyChanged事件。
现在,使用按钮我从磁盘加载文件,解析它并创建一个对象以分配给MainContent属性。在解析之前,我将State属性设置为2(加载),在分配之后,我将属性重置为1(已加载)。
第一次解析文件时,数据模板中的触发器不起作用(注意触发器绑定到父窗口的数据上下文的State属性,即ViewModel对象)。但第二次,确实如此!
有人可以指出哪里出错了吗?
我担心我不能在这里发布代码,但如果你有答案并给我发电子邮件,可以分享它。
答案 0 :(得分:2)
您的DataTemplate
已应用于TemplateViewModel
而不是ViewModel
。因此,在设置MainContent
属性之前,它不会适用于任何内容。