【问题标题】:How to access and provide default values to controls within WPF templates?如何访问 WPF 模板中的控件并为其提供默认值?
【发布时间】:2011-05-19 01:44:36
【问题描述】:

我正在为控制模板而苦苦挣扎。我目前正在构建一个 UI,它有几个窗格,这些窗格基本上是由更基本的控件构建的。

这是我们的一个构建窗格现在的样子:

<Grid>

    <StackPanel>

        <ContentControl  Template="{StaticResource ConstructionBorderCtrl}">
            <ContentControl Template="{StaticResource StringCtrl}" Content="Cash Event Value:"/>
        </ContentControl>

        <ContentControl  Template="{StaticResource ConstructionBorderCtrl}">
            <ContentControl  Template="{StaticResource RateCtrl}"></ContentControl>
        </ContentControl>

        <ContentControl Template="{StaticResource ConstructionBorderCtrl}">
            <ContentControl Grid.Row="0" Template="{StaticResource FromCtrl}"></ContentControl>
        </ContentControl>

        <ContentControl Template="{StaticResource ConstructionBorderCtrl}">
            <ContentControl Grid.Row="0" Template="{StaticResource StartEndDateCtrl}"></ContentControl>
        </ContentControl>

        <ContentControl Template="{StaticResource ConstructionBorderCtrl}">
            <ContentControl Grid.Row="0" Template="{StaticResource ComboStringCtrl}">Applicable Size:</ContentControl>
        </ContentControl>

    </StackPanel>

</Grid>

这里以 StringCtrl 的模板为例:

<ControlTemplate x:Key="StringCtrl" TargetType="ContentControl">

    <Grid Margin="5">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBlock Name="ctrlText" Margin="0,0,5,0" Text="{TemplateBinding Content}"></TextBlock>
        <TextBox Name="ctrlDefaultValue" Grid.Column="1" />
    </Grid>
</ControlTemplate>

从模板中可以看出,它实际上只是一个标签和一个文本框。现在假设我想为文本框提供默认值并对用户输入执行验证,但我想从父构造窗格提供该上下文并将其绑定到模板中的各个元素。我该怎么做呢?

【问题讨论】:

  • 我觉得你走错了路。你为什么要为此使用模板?如果您想创建模块化设计,只需使用 UserControls。

标签: c# wpf controltemplates


【解决方案1】:

这当然是我以前从未见过的设计。我认为 UserControls 或其他类型的自定义控件比 ControlTemplate 方法更适用于此。

但是,如果您确实想走这条路,如果模板中的结构/命名有一定的一致性,我可能会看到一种行为对您有用 - 您可以设置行为的属性,并且行为可以访问控件通过其 AssociatedObject 属性能够设置子项的值并进行验证。

不过对我来说似乎需要做很多工作。

【讨论】:

  • 这是一个糟糕的设计,所以我们转而使用常规用户控件。感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2019-09-02
  • 2012-02-08
相关资源
最近更新 更多