gpt4 book ai didi

wpf - CompositeCollection 内的绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 00:08:32 39 4
gpt4 key购买 nike

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

示例代码:

<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”绑定(bind)除外,该绑定(bind)无效。我想这是因为 CompositeCollection 不是 Freezable(另请参阅 Why is CompositeCollection not Freezable? )。

有人有解决办法吗?

最佳答案

我也遇到过类似的情况。为了解决这个问题,我找到了 following article .

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

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 中使用它,如下所示:

<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>

关于wpf - CompositeCollection 内的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786353/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com