如何在WPF中有效地更改控件模板?

时间:2012-05-10 09:11:22

标签: wpf controltemplate

主题是我已经定义了一个绑定到DataContext的自定义控件。我希望根据DataContext的特定属性值动态更改控件模板。

我想到了两种方法,但我不知道哪种方式更好。

1.不要在ResourceDictionary中使用控件模板,并且控件的所有细节都在C#代码中定义。使用DependencyProperty CallBack方法在DataContext的属性值更改时呈现控件。

2.在ResourceDictionary中定义控件模板,并使用DataTrigger更改'Control.Template'属性。

在我的应用程序中,将创建此类型的数千个实例,因此如果ControlTemplate更改无效,则实际上是不可接受的。

你能给我一些建议或更好的解决方案吗?

3 个答案:

答案 0 :(得分:1)

如果涉及数千个复杂控件实例,则使用任何标准WPF技术可能无效。请参阅http://msdn.microsoft.com/en-us/magazine/dd483292.aspx

我会使用MultiBinding + IMultiValueConverter来控制Control.Template,因为Template会依赖于多个DataContext属性,并且可能涉及复杂的逻辑。

答案 1 :(得分:0)

也许您可以在ContentPresenter中使用ControlTemplate来自定义部分控件。您可以为自动应用的可自定义部分提供DataTemplate

答案 2 :(得分:0)

我会使用带有数据触发器的样式来控制显示哪个模板。像这个例子:

<Style x:Key="Die1Face" TargetType="{x:Type Button}">
        <Setter Property="Template" Value="{StaticResource dieNone}" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=ThrowDie1[0]}" Value="1" >
                <Setter Property="Template" Value="{StaticResource dieOneA}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=ThrowDie1[0]}" Value="2" >
                <Setter Property="Template" Value="{StaticResource dieTwoA}" />
            </DataTrigger>
    </Style.Triggers>
    </Style>

这将提供您所需的灵活性。