0

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

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

1.不要在ResourceDictionary中使用控件模板,控件的所有细节都在C#代码中定义。当DataContext的属性值发生变化时,使用DependencyProperty回调方法来渲染控件。

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

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

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

4

3 回答 3

1

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

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

于 2012-05-10T09:47:09.223 回答
0

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

于 2012-05-10T09:24:39.937 回答
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>

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

于 2012-05-10T09:33:04.317 回答