DataTemplate数据触发器仅在第二次起作用

时间:2009-02-27 17:06:33

标签: wpf datatrigger

我有以下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对象)。但第二次,确实如此!

有人可以指出哪里出错了吗?

我担心我不能在这里发布代码,但如果你有答案并给我发电子邮件,可以分享它。

1 个答案:

答案 0 :(得分:2)

您的DataTemplate已应用于TemplateViewModel而不是ViewModel。因此,在设置MainContent属性之前,它不会适用于任何内容。