2012-12-03 46 views
1

现状:DataGrid的变化RowDetailsTemplate动态

我有一个DataGrid其中的项目可以属于不同的类别,说一个定制。每个类别都有自己的RowDetails模板。项目的类别可以更改,如果发生这种情况,我想要更改模板,如有必要。后面的ViewModel是一样的,我只是改变了界面元素(例如,在模板A中,我有一个TextBlock,而在模板B中我有一个TextBox,两个都有一个Binding与VM中的相同属性)。

我迄今所做的:

<DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <Control x:Name="RowDetails" Focusable="False" /> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding TemplateID, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="0"> 
        <Setter TargetName="RowDetails" Property="Template" Value="{StaticResource TemplateA}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding TemplateID, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="1"> 
       <Setter TargetName="RowDetails" Property="Template" Value="{StaticResource TemplateB}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding TemplateID, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="2"> 
       <Setter TargetName="RowDetails" Property="Template" Value="{StaticResource TemplateCustom}" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</DataGrid.RowDetailsTemplate> 

问题:

当我改变一个项目的类别,我可以看到模板的变化,但整个行获取ValidationErrorTemplate(红色边框,带有感叹号)。即使模板为空,也会发生这种情况!在我看来,只是改变模板使整个事情爆炸。

我在做什么错?谢谢!

回答

1

经过大量的尝试和重试之后,我发现问题出现在我的模板中的组合框中:如here所述,组合框的属性中的顺序很重要。在ItemsSource之前加上SelectedValue对我来说是诀窍,而使用Triggers的做法就像魅力一样。

尽管如此,我仍然对这样的解决方案感到震惊。我会将此标记为答案,但我仍然乐于接受建议。

+0

我正在努力解决同样的问题。你可以发布数据网格声明吗?你是在数据网格中定义你的rowdetails模板还是作为一个静态资源? –

+0

我放弃了那份工作,所以我没有源代码了,对不起。无论如何,这些模板是在DataGrid之外声明的(否则,我认为它们不可用),在我的情况下是作为包含'Datagrid'本身的'StackPanel'内的静态资源。为了解决这个问题,你必须交换'SelectedValue'和'ItemsSource',以使前者位于后者之前。 – Cynical