微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WPF Tabcontrol绑定

如何解决WPF Tabcontrol绑定

有我的密码

     <TabControl x:Name="TabControlsql" Margin="10,10,10" Grid.Row="2" SelectionChanged="TabControlsql_SelectionChanged" ItemsSource="{Binding}">
            <TabControl.Resources>
                <DataTemplate x:Key="TabHeader" DataType="TabItem">
                    <Grid>
                        <Grid.ColumnDeFinitions>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                            <ColumnDeFinition></ColumnDeFinition>
                        </Grid.ColumnDeFinitions>
                        <TextBlock Text="{Binding SourceImageTab}" FontSize="20" Foreground="Red"></TextBlock>//binding not work
                        <TextBlock Grid.Column="0" Text="[" />
                        <TextBlock Grid.Column="1" Text="{Binding RelativeSource={RelativeSource AncestorType=TabItem },Path=Header}" />
                        <TextBlock Grid.Column="2" Text="]" />
                        <Button Background="Transparent" BorderBrush="Transparent" Grid.Column="2" Height="15" Width="15" Padding="0" Name="btnUnLock" Click="btnUnLock_Click" Margin="10,0">
                            <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding SourceImageTab}" Height="12" ></Image>//binding not work
                        </Button>
                        <Button Background="Transparent" BorderBrush="Transparent" Grid.Column="3" Height="15" Width="15" Name="btnDelete" Padding="0"  Margin="3,0" Click="btnDelete_Click" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}},Path=Name}">
                            <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="..//Resources/cancel.png" Height="12" ></Image>
                        </Button>
                    </Grid>
                </DataTemplate>
            </TabControl.Resources>
        </TabControl>
        <TextBlock Text="{Binding SourceImageTab}" FontSize="20" Foreground="Red"></TextBlock>//this work

为什么只有一个绑定有效?第一和第二个不,为什么?也许问题是tabcontrol绑定?我还添加了Window.Inizialized {DataContext = this},谢谢

这是财产

public string SourceImageTab
    {
        get
        {
            return "..//Resources/locked.png";
        }
    }

解决方法

您正在使用两个不同的范围:MainWindow的范围和DataTemplate的范围。

两个作用域都有不同的DataContext值: 由于您已将MainWindow.DataContext设置为this,因此MainWindow.DataContext就是MainWindow本身。
DataTemplate.DataContext始终是目标数据项,在您的情况下,它就是当前的TabItem

由于SourceImageTab是在MainWindow上定义的,因此MainWIndow范围内的绑定有效。绑定Binding SourceImageTab解析为MainWindow.SourceImageTab属性。但是在DataTemplate内部,相同的绑定表达式解析为TabIte.SourceImageTab,该表达式不存在。

解决方案是调整DataTemplate内部的绑定。为了找到MainWindow,您可以使用Binding.RelativeSource。而且,当前具有TabItem作为源的绑定也可以简化为例如。 `{Binding Header}“:

MainWindow.xaml.cs

// TODO::Create a binding source collection which binds to the TabControl
partial class MainWindow : Window
{
  public ObservableCollection<MyTabDataItem> TabItems { get; set; }
  public MainWindow()
  {
    InitializeComponent();
    this.DataContext = this;
  }
}

MainWindow.xaml

<TabControl x:Name="TabControlSQL" ItemsSource="{Binding MyTabDataItem}">
  <TabControl.Resources>
    <DataTemplate x:Key="TabHeader" DataType="TabItem">
      <Grid>
        <Grid.ColumnDefinitions>
          ...
        </Grid.ColumnDefinitions>
        
        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=SourceImageTab}" FontSize="20" Foreground="Red" /> //binding now works

        ...           

        <TextBlock Grid.Column="1" Text="{Binding Header}" />

        ...

        <Button>
          <Image Source="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=SourceImageTab}" /> //binding now works
        </Button>
        ...
        <Button CommandParameter="{Binding Name}">
          <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="..//Resources/cancel.png" Height="12"  />
        </Button>
      </Grid>
    </DataTemplate>
  </TabControl.Resources>
</TabControl>

<TextBlock Text="{Binding SourceImageTab}" FontSize="20" Foreground="Red" /> // this worked before

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。