【问题标题】:WPF DataTemplate BindingWPF 数据模板绑定
【发布时间】:2014-08-23 09:58:35
【问题描述】:

我发现在 WPF TabControl 中使用 ContentTemplate/DataTemplate 时,我的绑定将不再起作用。

我设置了一个小例子来说明:

<Window x:Class="HAND.BindingExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="BindingExample" Height="506" Width="656"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
<Grid>
    <TabControl HorizontalAlignment="Left" Height="381"  VerticalAlignment="Top" Width="608">
        <TabItem Header="TabItem">
            <Label Content="{Binding Path=myString}"/>
        </TabItem>
        <TabItem Header="TabItem">
            <TabItem.ContentTemplate>
                <DataTemplate>
                    <Label Content="{Binding Path=myString}"/>
                </DataTemplate>
            </TabItem.ContentTemplate>
        </TabItem>
    </TabControl>
</Grid>
</Window>

Tab1 按预期工作,Tab2 为空。

后面的代码:

using System.Windows;

namespace HAND
{
    public partial class BindingExample : Window
    {
        public string myString { get; set; }

        public BindingExample()
        {
            myString = "Hello Stackoverflow";

            InitializeComponent();
        }
    }
}

【问题讨论】:

    标签: c# wpf data-binding datatemplate


    【解决方案1】:
    <TabItem Content="{Binding myString}" Header="TabItem">
        <TabItem.ContentTemplate>
            <DataTemplate>
                <Label Content="{Binding}" />
            </DataTemplate>
        </TabItem.ContentTemplate>
    </TabItem>
    

    但您知道,在自身上绑定一个窗口并不是可行的方法。 我不知道您是否只是为了示例而这样做,但如果没有尝试创建一个适当的 viewModel 来绑定您的窗口;)

    【讨论】:

    • 我让它在我的机器上运行。当您在自身上绑定一个窗口时,它可能不会运行,而我没有这样做。
    • 谢谢!这适用于我的示例。我在使用 MVVM 模式的真实程序中使用了不同的绑定类。我仍然不明白为什么您的代码有效而我的无效。我现在将尝试将示例的解决方案应用于我的应用程序。
    • Sheridan 使用与我相同的 XAML 代码发布了一个答案,但更好地解释了 ContentTemplate 的工作原理。它应该可以帮助您理解它
    • 好的,谢谢你们!
    • 嗨 miiite,您的答案对我有用,但测试错误。对你的答案进行编辑,我将恢复否决
    【解决方案2】:

    您错误地使用了ContentTemplate 属性。来自 MSDN 上的ContentControl.ContentTemplate Property 页面:

    获取或设置用于显示 ContentControl 内容的数据模板。

    因此,在设置该属性时,还需要将Content属性设置为某种数据源:

    <TabControl>
        <TabItem Header="TabItem">
            <Label Content="{Binding Path=myString}"/>
        </TabItem>
        <TabItem Header="TabItem" Content="{Binding Path=myString}">
            <TabItem.ContentTemplate>
                <DataTemplate>
                    <Label Content="{Binding}" />
                </DataTemplate>
            </TabItem.ContentTemplate>
        </TabItem>
    </TabControl>
    

    【讨论】:

    • 与 Miiite 相同的结论。也非常感谢您的精彩解释!
    • 为什么需要在 中设置 Content="{Binding Path=mystring}" 并在
    • 我们将myString 属性数据绑定到Content 属性以赋予它一些价值。在这里,该值只是一个字符串,但它可能是具有其他属性的对象。在ContentTemplate 中,我们告诉它我们希望在Label 中显示数据绑定对象的哪一部分。在这种情况下,我们想要绑定到整个字符串对象,所以我们使用{Binding} 来做到这一点。
    • Noto:该示例仅适用于只读绑定 - 如果您将 Label 更改为 TextBox,myString 将永远不会被写回。
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多