代码之家  ›  专栏  ›  技术社区  ›  Adam Rackis

在运行时更改数据模板

  •  2
  • Adam Rackis  · 技术社区  · 14 年前

    FindResource("fdds") as DataTemplate
    

    我见过很多的代码类型。我希望能够绑定模板,根据ViewModel中的属性查找资源。从概念上讲,我希望能够做到这一点,但编译器显然不喜欢:

     ... ItemTemplate="{StaticResource {Binding Path=VMTemplate}}">
    

    然后其他命令将更改ViewModel中VMTemplate的值。有办法这样做吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Stephan    14 年前

    StaticResource扩展是在分析XAML时的立即查找,这意味着资源必须出现在应用程序的开头。为了动态地设置一个模板,您必须做一些与第一行类似的事情。

    我看到的一种可能性是使DataTemplate具有一个扩展的自定义控件 ContentControl 它有多个DataTemplate属性,然后可以根据视图模型中的绑定值选择不同的模板。

        2
  •  2
  •   Adam Rackis    14 年前

    http://www.e-pedro.com/2009/06/using-data-binding-with-static-resources-in-wpf/

    当然,也可以手动将实际模板作为参数传递给其他命令:

    <Button Width="50" Command="{Binding ChangeTemplateCommand}" CommandParameter="{StaticResource vmDataTemplate}">White</Button>
    <Button Width="50" Command="{Binding ChangeTemplateCommand}" CommandParameter="{StaticResource vmDataTemplate2}">Lavender</Button>
    
    <ListBox x:Name="bookListBox" Grid.Row="0" ItemsSource="{Binding Path=BookSource}" ItemTemplate="{Binding Path=ItemSourceTemplate}">
    

    ChangeTemplateCommand = new RelayCommand(template => {
        this.ItemSourceTemplate = (DataTemplate)template;
        PropertyChanged(this, new PropertyChangedEventArgs("ItemSourceTemplate"));
    });