首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CompositeCollection内部的绑定

CompositeCollection内部的绑定
EN

Stack Overflow用户
提问于 2010-09-24 18:59:08
回答 1查看 3.1K关注 0票数 6

我想创建一个TabControl,其中包含一些“静态”TabItems (在XAML中显式键入)和一些动态添加的TabItems。为了实现这一点,我尝试使用CompositeCollection作为TabControl.ItemSource。

示例代码:

代码语言:javascript
复制
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        >
  <Window.Resources>
    <x:Array x:Key="SomeTexts" x:Type="sys:String">
      <sys:String>Text1</sys:String>
      <sys:String>Text2</sys:String>
    </x:Array>
  </Window.Resources>

  <TabControl>
    <TabControl.ItemsSource>
      <CompositeCollection>
        <TabItem Header="Test">
          <StackPanel>
            <TextBlock x:Name="MyText" Text="Blah" />
            <TextBlock Text="{Binding Text, ElementName=MyText}" />
          </StackPanel>
        </TabItem>
        <CollectionContainer Collection="{StaticResource SomeTexts}" />
      </CompositeCollection>
    </TabControl.ItemsSource>
  </TabControl>
</Window>

这个示例有一个固定的选项卡项和三个“动态”选项卡项(请注意,这里的'SomeTexts‘是一个固定的数组,只是为了简化示例;在实际代码中,它将是一个动态集合)。

除了“ElementName”绑定不起作用外,该示例可以正常工作。我想这是因为CompositeCollection不是Freezable (参见Why is CompositeCollection not Freezable?)。

有谁有解决方案吗?

EN

回答 1

Stack Overflow用户

发布于 2015-01-28 04:24:28

我也有过类似的场景。为了解决这个问题,我找到了following article

这篇文章解释了如何创建一个可以设置数据上下文的freezable代理对象。然后将此代理添加为可以作为静态资源引用的资源。请参阅以下内容:

代码语言:javascript
复制
public class BindingProxy : Freezable
{
    public static DependencyProperty DataContextProperty = DependencyProperty.Register(
        "DataContext", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));

    public object DataContext
    {
        get { return GetValue(DataContextProperty); }
        set { SetValue(DataContextProperty, value); }
    }

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }
}

然后可以像这样在xaml中使用它:

代码语言:javascript
复制
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:y="clr-namespace:Namespace.Of.BindingProxy"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        >
  <Window.Resources>
    <x:Array x:Key="SomeTexts" x:Type="sys:String">
      <sys:String>Text1</sys:String>
      <sys:String>Text2</sys:String>
    </x:Array>
    <y:BindingProxy x:Key="Proxy" DataContext="{Binding}" />
  </Window.Resources>

  <TabControl>
    <TabControl.ItemsSource>
      <CompositeCollection>
        <TabItem Header="Test">
          <StackPanel>
            <TextBlock x:Name="MyText" Text="Blah" />
            <TextBlock Text="{Binding DataContext.SomeProperty, Source={StaticResource Proxy}}" />
          </StackPanel>
        </TabItem>
        <CollectionContainer Collection="{StaticResource SomeTexts}" />
      </CompositeCollection>
    </TabControl.ItemsSource>
  </TabControl>
</Window>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3786353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档