gpt4 book ai didi

wpf - XAML DataTemplate 只创建一个实例

转载 作者:行者123 更新时间:2023-12-01 08:53:25 26 4
gpt4 key购买 nike

以下只会创建一个 MyTabView 的实例.我已通过在 MyTabView.xaml.cs 的构造函数中放置一个断点来确认这一点。该 View 显示在一个选项卡中,无论我创建多少选项卡,我只点击一次该构造函数。

<DataTemplate DataType="{x:Type vm:MyTabViewModel}" x:Shared="false">
<vw:MyTabView />
</DataTemplate>

选项卡控件:

    <TabControl
Grid.Row="1"
ItemsSource="{Binding Tabs}"
SelectedItem="{Binding SelectedTab}"
>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayName}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl>

这会导致所有选项卡反射(reflect)共享任何未绑定(bind)到 View 模型的状态:如果您移动 GridSplitter , 那是一样的 GridSplitter在所有其他选项卡中,因此在用户看来您移动了所有这些选项卡。这很荒谬。

我不明白。有什么办法可以用TabControl有多个相同类型的项目?

编辑:添加了x:Shared="false"DataTemplate .

更新:

所以我找到了几个修复程序,但我不太喜欢它们。我将看看编写一个转换 ObservableCollection<Object> 的转换器至 ObservableCollection<TabItem> -- 有点像

的实时更新版本
coll.Select(vm => new TabItem() { Content = vm });

...但我们会看看它是否喜欢得到 TabItem来自 ItemsSource 的实例.我的钱说不要赌它。但我们拭目以待。

更新 2:花了一段时间才回到这个。尽管在选项卡项目集合中交换的噱头有效,但SelectedItem是问题。事实证明,还有另一个解决方案(如下)不会产生该问题,并且还避免了创建必须反射(reflect)源集合中更改的“中间人”集合的复杂性和愚蠢性。

最佳答案

尝试将 x:Shared="false" 属性添加到您的模板。

关于wpf - XAML DataTemplate 只创建一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30810664/

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