WPF数据模板绑定

本文关键字:绑定 数据 WPF | 更新日期: 2023-09-27 18:11:05

我发现在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();
        }
    }
}

WPF数据模板绑定

您使用ContentTemplate属性不正确。从MSDN上的ContentControl.ContentTemplate属性页:

获取或设置用于显示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>
<TabItem Content="{Binding myString}" Header="TabItem">
    <TabItem.ContentTemplate>
        <DataTemplate>
            <Label Content="{Binding}" />
        </DataTemplate>
    </TabItem.ContentTemplate>
</TabItem>

但正如你所知,把一扇窗户绑在自己身上并不是一条路。我不知道你这样做是否只是为了示例,但如果不是,请尝试创建一个合适的viewModel来绑定你的窗口;(