programing

뷰 모델의 컬렉션에 Collection Container를 바인딩하려면 어떻게 해야 합니까?

easyjava 2023. 4. 14. 22:18
반응형

뷰 모델의 컬렉션에 Collection Container를 바인딩하려면 어떻게 해야 합니까?

나는 물건의 컬렉션을 표시하는 속성을 가진 뷰 모델을 가지고 있다.아이템이 있는 콤보박스를 가지고 있습니다.소스 속성이 이 컬렉션에 바인딩되어 있습니다.이제 사용자는 목록에서 선택할 수 있습니다.

사용자가 선택을 지울 수 있도록 하고 싶기 때문에 ComboBox에 항목(Null)을 추가합니다.꽤 간단해.

아이템에 Composite Collection을 사용하기로 했습니다.소스: ComboBox 및 추가 Null 항목에 기존 목록의 항목을 추가할 수 있습니다.

잠시 이 문제와 싸운 후 Composite Collection Class에 대한 문서로 돌아가기로 했습니다.예를 복사하여 수정하여 정적 리소스 대신 뷰 모델을 사용했습니다.

Collection Container를 ViewModel에 의해 공개된 목록에 바인드하면 목록에 항목이 표시되지 않습니다.

이 문제를 어떻게 해결해야 할지 잘 모르겠고 이 주제에 대해 조언을 구하고 있습니다.

XAML 코드는 다음과 같습니다.

<Window Background="CornflowerBlue" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   xmlns:c="clr-namespace:TryingWPF"  x:Class="CompositeCollections"  Title="CompositeCollections"  SizeToContent="WidthAndHeight">
<Window.Resources>
    <c:CompositeCollectionVM x:Key="CompositeCollectionVM"/>
    <XmlDataProvider x:Key="GreekHeroesData" XPath="GreekHeroes/Hero">
        <x:XData>
            <GreekHeroes xmlns="">
                <Hero Name="Jason" />
                <Hero Name="Hercules" />
                <Hero Name="Bellerophon" />
                <Hero Name="Theseus" />
                <Hero Name="Odysseus" />
                <Hero Name="Perseus" />
            </GreekHeroes>
        </x:XData>
    </XmlDataProvider>
    <DataTemplate DataType="{x:Type c:GreekGod}">
        <TextBlock Text="{Binding Path=Name}" Foreground="Gold"/>
    </DataTemplate>
    <DataTemplate DataType="Hero">
        <TextBlock Text="{Binding XPath=@Name}" Foreground="Cyan"/>
    </DataTemplate>
</Window.Resources>

<StackPanel DataContext="{StaticResource CompositeCollectionVM}">
    <TextBlock FontSize="18" FontWeight="Bold" Margin="10" HorizontalAlignment="Center" Foreground="WhiteSmoke">Trying Composite Collections</TextBlock>
    <DockPanel>
        <ListBox Name="myListBox" Height="300" Background="#99333333">
            <ListBox.ItemsSource>
                <CompositeCollection>
                    <CollectionContainer Collection="{Binding GreekGods}" />
                    <CollectionContainer Collection="{Binding Source={StaticResource GreekHeroesData}}" />
                    <ListBoxItem Foreground="Magenta">Other Listbox Item 1</ListBoxItem>
                    <ListBoxItem Foreground="Magenta">Other Listbox Item 2</ListBoxItem>
                </CompositeCollection>
            </ListBox.ItemsSource>
        </ListBox>
        <ListBox ItemsSource="{Binding GreekGods}" Background="#99333333" Margin="5,0" HorizontalAlignment="Right">
        </ListBox>
    </DockPanel>
</StackPanel>
</Window>

(아이템을 바인드하면 알 수 있듯이목록 속성에 대한 두 번째 목록 상자 원본...아이템이 표시됩니다.)

그리고 여기 제 VB가 있습니다.XAML 코드를 동작시키는 NET 코드:

Public Class CompositeCollections
End Class

Public Class GreekGod
    Public Property GreekName
    Public Property Name
    Public Property Description
    Public Sub New(ByVal greekName As String, ByVal englishName As String, ByVal description As String)
        Me.GreekName = greekName
        Me.Name = englishName
        Me.Description = description
    End Sub
End Class

Public Class CompositeCollectionVM
    Public Property GreekGods As System.Collections.ObjectModel.ObservableCollection(Of GreekGod)
    Public Sub New()
        GreekGods = New System.Collections.ObjectModel.ObservableCollection(Of GreekGod)

        GreekGods.Add(New GreekGod("Ἀφροδίτη (Venus)", "Aphrodite", "Goddess of love and beauty. Although married to Hephaestus she had many lovers, most notably Ares. She was depicted as a beautiful woman usually accompanied by her son Eros. Her symbols include the rose, scallop shell, and myrtle wreath. Her sacred animal is the dove."))
        GreekGods.Add(New GreekGod("Ἀπόλλων (Apóllō)", "Apollo", "God of music, healing, plague, prophecies, poetry, and archery; associated with light, truth and the sun. He is Artemis's twin brother and Hermes elder brother, and son of Zeus and Leto. He was depicted as a handsome, beardless youth with long hair and various attributes including a laurel wreath, bow and quiver, raven, and lyre. Apollo's sacred animal are red cattle."))
        GreekGods.Add(New GreekGod("Ἄρης (Mars)", "Ares", "God of war, bloodlust, violence, manly courage, and civil order. The son of Zeus and Hera, he was depicted as either a mature, bearded warrior dressed in battle arms, or a nude beardless youth with helm and spear. His attributes are golden armour and a bronze-tipped spear. His sacred animals are the vulture, venomous snakes, alligators, and dogs."))
        GreekGods.Add(New GreekGod("Ἄρτεμις (Diana)", "Artemis", "Virgin goddess of the hunt, wilderness, wild animals, childbirth and plague. In later times she became associated with the moon. She is the daughter of Zeus and Leto, and twin sister of Apollo. In art she was usually depicted as a young woman dressed in a short knee-length chiton and equipped with a hunting bow and a quiver of arrows. In addition to the bow, her attributes include hunting spears, animal pelts, deer and other wild animals. Her sacred animals are deer, bears, and wild boars."))
        GreekGods.Add(New GreekGod("Ἀθηνᾶ (Minerva)", "Athena", "Goddess of wisdom, warfare, battle strategy, heroic endeavour, handicrafts and reason. According to most traditions she was born from Zeus's head. She was depicted crowned with a crested helm, armed with shield (Aegis), which holds medusa's head to paralyze her enemies who looked at it and a spear. Her symbols include the aegis and the olive tree. She is commonly shown accompanied by her sacred animal, the snowy owl."))
        GreekGods.Add(New GreekGod("Δημήτηρ (Ceres)", "Demeter", "Goddess of agriculture, horticulture, grain and harvest. Demeter is a daughter of Cronus and Rhea and sister of Zeus, by whom she bore Persephone. She was depicted as a mature woman, often crowned and holding sheafs of wheat and a torch. Her symbols are the Cornucopia (horn of plenty), wheat-ears, the winged serpent and the lotus staff. Her sacred animals are pigs and snakes."))
        GreekGods.Add(New GreekGod("Διόνυσος (Bacchus)", "Dionysos", "God of wine, parties and festivals, madness, civilization, drunkenness and pleasure at forever young. He was depicted in art as either an older bearded god or a pretty effeminate, long-haired youth. His attributes include the thyrsus (a pinecone-tipped staff), drinking cup, grape vine, and a crown of ivy. Animals sacred to him include dolphins, serpents, tigers, panthers, and donkeys. A later addition to the Olympians, in some accounts he replaced Hestia."))
        GreekGods.Add(New GreekGod("ᾍδης (Hádēs) or Πλούτων (Ploútón)", "Hades or Pluto", "King of the Underworld and god of the dead and the hidden wealth of the Earth. His consort is Persephone and his attributes are the key of Hades, the Helm of Darkness, and the three-headed dog, Cerberus. The screech owl was sacred to him. Despite being the son of Cronus and Rhea and the elder brother of Zeus, as a chthonic god he is only rarely listed among the Olympians. The name Pluto became more common in the Classical period with the mystery religions and Athenian literature."))
        GreekGods.Add(New GreekGod("Ἥφαιστος (Hḗphaistos)", "Hephaestus or Vulcan", "Crippled god of fire, metalworking, stonemasonry, sculpture and volcanism. The son of Hera alone, he is the smith of the gods and the husband of the adulterous Aphrodite. He was usually depicted as a bearded man holding hammer and tongs—the tools of a smith—and riding a donkey. His symbols are the hammer, tongs, and anvil. His sacred animals are the donkey, the guard dog and the crane. When he was born, he was thrown off of Mount Olympus by Hera as he was considered ugly."))
        GreekGods.Add(New GreekGod("Ἥρα (Juno)", "Hera", "Queen of marriage, women, childbirth, heirs, kings and empires. She is daughter of Cronus and Rhea. She was usually depicted as a beautiful woman wearing a crown and veil and holding a royal, lotus-tipped staff. Her sacred animals are the cow, the peacock. She is the eternal wife of Zeus."))
        GreekGods.Add(New GreekGod("Ἡρμῆς (Mercury)", "Hermes", "God of travel, messengers, trade, thievery, cunning wiles, language, writing, diplomacy, athletics, and animal husbandry. He is the messenger of the gods, a psychopomp who leads the souls of the dead into Hades' realm, and the son of Zeus and Maia. He was depicted either as a handsome and athletic beardless youth, or as an older bearded man. His attributes include the herald's wand or caduceus, winged sandals, and a traveler's cap. His sacred animals are the tortoise, the ram, and the hawk."))
        GreekGods.Add(New GreekGod("Ἑστία (Vesta)", "Hestia", "Virgin goddess of the hearth, home and cooking. She is a daughter of Rhea and Cronus and sister of Zeus. She was depicted as a modestly veiled woman, whose symbols are the hearth and kettle. In some accounts, she gave up her seat as one of the Twelve Olympians to tend to the sacred flame on Mount Olympus for Dionysus."))
        GreekGods.Add(New GreekGod("Ποσειδῶν (Neptune)", "Poseidon", "God of the sea, rivers, floods, droughts, storms, earthquakes, and the creator of horses; known as the 'Earth Shaker' or 'Storm Bringer'. He is a son of Cronus and Rhea and brother to Zeus and Hades. In classical artwork, he was depicted as a mature man of sturdy build with a dark beard, and holding a trident. The horse and the dolphin are sacred to him."))
        GreekGods.Add(New GreekGod("Ζεύς (Jupiter)", "Zeus", "The king of the gods, the ruler of Mount Olympus and the god of the sky, weather, thunder, law, order, and fate. He is the youngest son of Cronus and Rhea, whom he overthrew after Cronus swallowed his brothers and sisters and he is brother-husband to Hera. In artwork, he was depicted as a regal, mature man with a sturdy figure and dark beard. His usual attributes are the royal sceptre and the lightning bolt. His main attribute was his master bolt. His sacred animals are the eagle and the bull."))


    End Sub
End Class

도와주셔서 감사합니다!

편집:

H.B.의 대답은 완벽하게 먹혔다.다음은 작동 중인 XAML 업데이트입니다.

<Window Background="CornflowerBlue"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:TryingWPF"
  x:Class="CompositeCollections"
  Title="CompositeCollections"
  SizeToContent="WidthAndHeight">
    <Window.Resources>
        <c:CompositeCollectionVM x:Key="CompositeCollectionVM"/>
        <XmlDataProvider x:Key="GreekHeroesData" XPath="GreekHeroes/Hero">
            <x:XData>
                <GreekHeroes xmlns="">
                    <Hero Name="Jason" />
                    <Hero Name="Hercules" />
                    <Hero Name="Bellerophon" />
                    <Hero Name="Theseus" />
                    <Hero Name="Odysseus" />
                    <Hero Name="Perseus" />
                </GreekHeroes>
            </x:XData>
        </XmlDataProvider>
        <DataTemplate DataType="{x:Type c:GreekGod}">
            <TextBlock Text="{Binding Path=Name}" Foreground="Gold"/>
        </DataTemplate>
        <DataTemplate DataType="Hero">
            <TextBlock Text="{Binding XPath=@Name}" Foreground="Cyan"/>
        </DataTemplate>
    </Window.Resources>

    <StackPanel x:Name="myStackPanel" DataContext="{StaticResource CompositeCollectionVM}">
        <StackPanel.Resources>
            <CompositeCollection x:Key="compCollection">
                <CollectionContainer Collection="{Binding DataContext.GreekGods, Source={x:Reference myStackPanel}}" />
                <CollectionContainer Collection="{Binding Source={StaticResource GreekHeroesData}}" />
                <ListBoxItem Foreground="Magenta">Other Listbox Item 1</ListBoxItem>
                <ListBoxItem Foreground="Magenta">Other Listbox Item 2</ListBoxItem>
            </CompositeCollection>
        </StackPanel.Resources>
        <TextBlock FontSize="18" FontWeight="Bold" Margin="10" HorizontalAlignment="Center" Foreground="WhiteSmoke">Trying Composite Collections</TextBlock>
        <DockPanel>

            <ListBox Name="compositeListBox" ItemsSource="{Binding Source={StaticResource compCollection}}" Height="300" Background="#99333333" >  
            </ListBox>
            <ListBox Name="greekGodsListBox" ItemsSource="{Binding GreekGods}" Background="#99333333" Margin="5,0" HorizontalAlignment="Right">
            </ListBox>
        </DockPanel>
    </StackPanel>

</Window>

CompositeCollection없다DataContext, 의 바인딩CollectionContainers속성에 직접 바인드하는 경우(암묵적으로 사용하는 경우)는 동작하지 않습니다.DataContext소스로서).

소스를 명시적으로 지정해야 합니다. 컨트롤 이름을 지정해 주세요.DataContext를 사용하여 취득합니다(ElementName동작하지 않는다) 또는StaticResource,예.

<CollectionContainer Collection="{Binding DataContext.GreekGods, Source={x:Reference myStackPanel}}"/>
<CollectionContainer Collection="{Binding GreekGods, Source={StaticResource CompositeCollectionVM}}"/>

를 사용할 때 주의해 주세요.x:Reference컴파일러는 주기적인 의존성 오류로 쉽게 문제를 일으키기 때문에 이러한 오류를 피할 수 있습니다.CompositeCollection참조하는 컨트롤의 자원 내에 있는 경우, 그 컨트롤이 속해 있는 장소에 삽입하여StaticResource마크업 확장자

IMultiValueConverter에 적합하다CompositeCollection단, xaml에 내용을 추가하는 경우는 제외됩니다.

컨버터:

using System;
using System.Collections;
using System.Globalization;
using System.Windows.Data;

public class CompositeCollectionConverter : IMultiValueConverter
{
    public static readonly CompositeCollectionConverter Default = new CompositeCollectionConverter();

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var compositeCollection = new CompositeCollection();
        foreach (var value in values)
        {
            var enumerable = value as IEnumerable;
            if (enumerable != null)
            {
                compositeCollection.Add(new CollectionContainer { Collection = enumerable });
            }
            else
            {
                compositeCollection.Add(value);
            }
        }

        return compositeCollection;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("CompositeCollectionConverter ony supports oneway bindings");
    }
}

사용방법:

<ListBox>
    <ListBox.ItemsSource>
        <MultiBinding Converter="{x:Static local:CompositeCollectionConverter.Default}">
            <Binding Path="Col1" />
            <Binding Path="Col2" />
            ...
        </MultiBinding>
    </ListBox.ItemsSource>
    ...
</ListBox>

언급URL : https://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model

반응형