【问题标题】:Binding from within a DataTemplate?从 DataTemplate 中绑定?
【发布时间】:2023-04-05 14:38:01
【问题描述】:

我正在构建一个 Silverlight 控件,并尝试通过它们各自的 DataTemplates 为 Header 和 Body ContentControls 设置绑定。我不知道为什么,但这不起作用(静默失败)。我唯一的猜测是这是因为 DataTemplates 是 StaticResources。任何人都可以提供建议吗?该控件具有以下默认模板:

<Style TargetType="local:LayoutItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="local:LayoutItem">
            <StackPanel>
                <StackPanel.Resources>

                    <DataTemplate x:Key="DefaultHeaderTemplate">
                        <StackPanel>
                           <TextBlock Text="{Binding HeaderText}" FontSize="15"/>
                        </StackPanel>
                    </DataTemplate>

                    <DataTemplate x:Key="DefaultBodyTemplate">
                        <StackPanel>
                            <TextBlock Text="{Binding BodyText}" FontSize="12"/>
                        </StackPanel>
                    </DataTemplate>

                </StackPanel.Resources>

                <ContentControl x:Name="Header" 
                   ContentTemplate="{StaticResource DefaultHeaderTemplate}" />
                <ContentControl x:Name="Body" 
                   ContentTemplate="{StaticResource DefaultBodyTemplate}" />
            </StackPanel>
        </ControlTemplate>
   </Setter.Value>

谢谢!


更新

实际上,下面的代码也不起作用,所以我对 StaticResources 的假设可能是错误的。

<ContentControl x:Name="Header">
<ContentControl.ContentTemplate>
    <DataTemplate x:Key="DefaultHeaderTemplate">
        <StackPanel>
            <TextBlock Text="{Binding HeaderText}" FontSize="15"  />
        </StackPanel>
    </DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>

【问题讨论】:

  • 控件的 DataContext 是否设置在某处。您绑定的数据是否具有“HeaderText”和“BodyText”属性?
  • 是的,我很确定这是真的。作为证明,我可以用 替换 ContentControl 并且它可以工作。

标签: silverlight data-binding datatemplate


【解决方案1】:

我不想回答我自己的问题,但我得到了它的工作。这确实是由于其他地方的问题。为了将来参考,以下代码适用于我:

<Style TargetType="local:LayoutItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="local:LayoutItem">
            <StackPanel x:Name="LayoutRoot">
                <StackPanel.Resources>

                    <DataTemplate x:Key="DefaultHeaderTemplate">
                        <StackPanel>
                            <TextBlock FontSize="50" Text="{Binding Path=HeaderText}" />
                        </StackPanel>
                    </DataTemplate>

                </StackPanel.Resources>

                <ContentControl x:Name="Header" Content="{Binding}" ContentTemplate="{StaticResource DefaultHeaderTemplate}" />

            </StackPanel>
        </ControlTemplate>
    </Setter.Value>
</Setter>

请注意 Content="{Binding}" 添加。这很重要。 :)

【讨论】:

  • Path 中的Binding 不是多余的吗?
  • 可爱,.. 正是我所缺少的。 +1
【解决方案2】:

这适用于我的(3 Beta):

        <ContentControl x:Name="Header">
            <ContentControl.ContentTemplate>
                <DataTemplate >
                    <StackPanel>
                        <TextBlock Text="{Binding HeaderText}" FontSize="15"  />
                    </StackPanel>
                </DataTemplate>
            </ContentControl.ContentTemplate>
            <ContentPresenter />
        </ContentControl>

但是,我不知道它为什么会起作用...我认为这是因为您可以将模板放在演示者周围,但后来玩得更多,并意识到您包装 contentpresenter 的任何内容都会被完全忽略。

【讨论】:

    【解决方案3】:

    您需要在某处设置页面的数据上下文。可以在后面的代码中完成

    /// ctor
    public MyClass()
    {
       this.DataContext = ObjectThatIsDataContext;
    }
    

    或在 XAML 中:

    <UserControl ...>
        <UserControl.Resources>
           <myNS:MyClass x:Name="TheContext" x:Key="TheContext" />    </UserControl.Resources>
        <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" >
            <TextBlock Text="{Binding Path=Field1}" />
        </Grid>
    </UserControl>
    

    另见this post

    【讨论】:

    • 如上cmets中提到的,我已经在设置DataContext了。
    猜你喜欢
    • 2013-05-29
    • 2012-07-01
    • 2016-03-23
    • 1970-01-01
    • 2021-08-22
    • 2014-07-30
    • 1970-01-01
    • 2011-07-21
    • 2011-12-09
    相关资源
    最近更新 更多