2011-01-19 3 views
12

Jeśli chcę wiązać coś w rodzaju combobox w kodzie z tyłu, nie mam problemu. Coś takiego jak:Czy można utworzyć listę zasobów w Xaml?

List<string> strings = new List<string>(); 
AddStringsFromDataSourceToList(strings); 

comboBox1.ItemSource = strings; 

O ile mogę powiedzieć, nie ma szybkiej i brudnej metody zrobienia tego w XAML. Za całą pochwałę, którą wpf otrzymuje za swoje super proste wiązanie danych, coś prostego wydaje się o wiele łatwiej po prostu zrobić w języku C#. Czy istnieje prostszy sposób na zrobienie tego niż tworzenie wrapperów DependencyProperty i dodawanie ich jako zasobów bez pomocy intelliSense lub wszystkiego, co przechodzi w ObservableCollections? Rozumiem, że nie jest to niemożliwe, ale muszę czegoś przegapić, jeśli tak proste zadanie wydaje się tak głębokie ...

EDYCJA: Aby wyjaśnić, dodawanie dynamicznych list jest tutaj problemem, a nie statycznymi tablicami. Łatwo jest dodawać elementy ręcznie, jak zauważyło wielu.

+1

WPF dostaje pochwałę za to, że dobrze pozwala na odseparowanie logiki od projektowania i tak dalej - nie dlatego, że może zrobić wszystko i cokolwiek. –

+0

@ Rozczarowanie - to nie jest zbyt szalone ... na pewno nie "wszystko". Jest to po prostu kwestia przewodnictwa jednego z najczęstszych zadań w budowaniu aplikacji. –

+0

Wiem, że to nie szalone; ale gdy już zaczniecie cieszyć się beztroską i pracować nad tym, jak "utworzę ten fragment danych w interfejsie użytkownika ..." kto wie, gdzie to się skończy? A jeśli mówimy o "danych", które zasadniczo można uznać za część interfejsu użytkownika, takich jak lista rozwijanych opcji, które są powszechne i stałe, to zazwyczaj wykorzystywany kontener jest wyodrębniany i ponownie wykorzystywany. Nie dostaję się do ciebie, pytania ani metody, tylko stwierdzam pewne rzeczy, BTW. –

Odpowiedz

3

Sure znajduje się:

<ComboBox> 
    <ComboBoxItem>One</ComboBoxItem> 
    <ComboBoxItem>Two</ComboBoxItem> 
</ComboBox> 

istnieją inne składnie w zależności od swojej bramki, które są prawie tak proste - wykorzystanie zasobów lub itemssources wbudowanych lub zgrupowanych danych .. nawet xml dane. Nie denerwuj się z frustracji, ponieważ pierwsza rzecz, którą wypróbowałeś, nie była łatwa - moim zdaniem wpf jest wart krzywej uczenia się.

WPF zdobywa uznanie, ponieważ znacznie ułatwia odseparowanie efektów wizualnych od formularzy okien, a także sprawia, że ​​tworzenie atrakcyjnych efektów wizualnych jest znacznie łatwiejsze, nie dlatego, że ułatwia to proste przykłady. Jednak w tym przypadku jest to łatwiejszy do wykonania niż prosty przykład.

Za pomocą swojej edycji Skąd chcesz je pobrać? Nie trzeba tworzyć właściwości zależności ani możliwych do zaobserwowania kolekcji w żaden sposób. Zrobić to będzie prosta właściwość list (w tym przypadku wolę używać zbioru zbiorczego w pliku xaml).Nie zapomnij także, że nie musisz potrzebujesz, aby użyć wszystkich XAML, jeśli go nienawidzisz. Ale jeśli projektujesz WPF, a mimo to znajdziesz wiele zadań (takich jak ten) łatwo.

+0

Niestety, nie było jasne, ale szukam sposobu na dodanie dynamicznej zawartości (na przykład z listy , gdzie wartości nie są znane). –

+2

@Prof Plum Przypuszczam, że nie rozumiem - chcesz, aby xaml trzymał statyczny zasób bez kodu, ale chcesz, aby wartości były dynamiczne? Gdzie/kiedy zostaną ustawione wartości? –

+0

Dzięki, co obejmuje metoda collectionviesource? Jeśli znasz jakieś linki, które demonstrują zwięzłe użycie oprócz MSDN, byłoby całkiem pomocne. –

1

można zrobić:

<ComboBox> 
     <ComboBoxItem>one</ComboBoxItem> 
     <ComboBoxItem>two</ComboBoxItem> 
    </ComboBox> 

i istnieje również składnia do uznania (i pośrednio tworzenie) dane na przykład sekcji zasobów.

Może można wskazać bardziej pełny scenariusz, z wymaganiami i ograniczeniami?

+0

edytowane, aby pokazać, co naprawdę robiłem: kiedy elementy listy są nieznane. –

+1

Teraz wydaje się, że chcesz wymieszać rozkazujący C# z deklaratywnym XAML. Jeśli po prostu przekształcisz funkcję w nieruchomość, którą już masz. –

5

Czy szukasz czegoś takiego:

<ComboBox> 
    <ComboBox.ItemsSource> 
     <x:Array Type="sys:String" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
     </x:Array> 
    </ComboBox.ItemsSource>     
</ComboBox> 

Jeśli chcesz tylko zdefiniować kilka rzeczy na liście, należy spojrzeć na rozwiązania z Henk Holterman. Przy okazji możesz zadeklarować tablicę jako zasób i dla innych typów.

Aktualizacja

Wydaje się, że zmieniłeś swoje pytanie. Jednak nie rozumiem teraz, jakie jest twoje pragnienie. Jeśli chcesz powiązać kolekcję masz w kodzie opóźnieniem, a następnie dokonać własność publiczną, która zwraca tę kolekcję, należy ustawić DataContext do obiektu, który naraża tę właściwość i zdefiniować wiążącej w XAML:

<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"... 

Nadziei zrozumiałem swoje pytanie rację ...

33
<Window.Resources> 
    <x:Array x:Key="strings" Type="sys:String" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
    </x:Array> 
    <!-- likewise --> 
    <x:Array x:Key="persons" Type="{x:Type local:Person}" 
      xmlns:local="clr-namespace:namespace-where-person-is-defined"> 
      <local:Person FirstName="Sarfaraz" LastName="Nawaz"/> 
      <local:Person FirstName="Prof" LastName="Plum"/> 
    </x:Array> 
<Window.Resources> 


<ComboBox ItemsSource="{StaticResource strings}" /> 

<ListBox ItemsSource="{StaticResource persons}"> 
    <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock> 
        <Run Text="{Binding FirstName}"/> 
        <Run Text=" "/> 
        <Run Text="{Binding LastName}"/> 
       </TextBlock> 
      </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Wolałbym zdefiniować xmlns na poziomie okna, np. ' zamiast zasobów tablicy. To jest bardzo czysty solidny standard XAML. – cod3monk3y

+0

Po prostu heads up, w twoim xaml masz , ale powinno być . Nie mogę dokonać edycji, ponieważ jest mniej niż 6 znaków. – edhedges

+0

@edhedges: Naprawiono. Dzięki. – Nawaz