gpt4 book ai didi

wpf - 在 XAML 中实例化和重用对象的实例

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

我想在 XAML 中实例化对象,并重用这些实例。我认为它应该很简单,但我被卡住了,我可能遗漏了一些明显的东西。

假设我想将 Cat 添加到不同的 Room(Room 有一个 ObservableCollection 包含 Cat 类型的对象)。在 UserControl.Resources 中,我创建了 ObjectDataProviders:

<ObjectDataProvider x:Key="Cat1" ObjectType="{x:Type local:Cat}">
<ObjectDataProvider.ConstructorParameters>
<System:String>Tom</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="Cat2" ObjectType="{x:Type local:Cat}">
<ObjectDataProvider.ConstructorParameters>
<System:String>Garfield</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="Cat3" ObjectType="{x:Type local:Cat}">
<ObjectDataProvider.ConstructorParameters>
<System:String>Furball</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

在我的 UserControl 中,我想将 Cats 添加到房间:
<local:Room x:Name="Room1">
<local:Room.Cats>

</local:Room.Cats>
<local:Room>
<local:Room x:Name="Room2">
<local:Room.Cats>

</local:Room.Cats>
<local:Room>

将 Cat 实例添加到 ObservableCollection Room.Cats 的语法是什么?例如,我想将 Cat1 和 Cat2 添加到 Room1,将 Cat2 和 Cat3 添加到 Room2。我是不是完全走错了路?

最佳答案

以您尝试的方式重用单个实例是很棘手的。这是因为您通常在 XAML 中引用单个对象的方式是使用 StaticResource标记扩展,并且您只能使用该标记扩展来设置属性值。

因此,您可以轻松设置 Cat 类型的属性。到 Cat 的实例:

<Room Cat="{StaticResource Cat1}"/>

但是您不能通过设置属性来填充集合。

令人惊讶的是,答案是直接在 XAML 中实例化您的对象,而不是将它们包装在 ObjectDataProvider 中。 s。你还在用 ObjectDataProvider ,但不同的是:
<Window x:Class="ObjectDataProviderDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ObjectDataProviderDemo"
xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
Title="MainWindow"
Height="350"
Width="525">
<Window.Resources>
<local:Cat x:Key="Tom" Name="Tom"/>
<local:Cat x:Key="Garfield" Name="Garfield"/>
<local:Cat x:Key="Furball" Name="Furball"/>
<Collections:ArrayList x:Key="CatList1">
<ObjectDataProvider ObjectInstance="{StaticResource Tom}" />
<ObjectDataProvider ObjectInstance="{StaticResource Garfield}" />
<ObjectDataProvider ObjectInstance="{StaticResource Furball}" />
</Collections:ArrayList>
<Collections:ArrayList x:Key="CatList2">
<ObjectDataProvider ObjectInstance="{StaticResource Tom}" />
<ObjectDataProvider ObjectInstance="{StaticResource Furball}" />
</Collections:ArrayList>
<DataTemplate x:Key="CatTemplate">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</Window.Resources>
<StackPanel>
<ListBox ItemsSource="{StaticResource CatList1}"
ItemTemplate="{StaticResource CatTemplate}"/>
<ListBox ItemsSource="{StaticResource CatList2}"
ItemTemplate="{StaticResource CatTemplate}" />
</StackPanel>
</Window>

关于wpf - 在 XAML 中实例化和重用对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840371/

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