Pergunta

Eu procuro alto e baixo e não consigo encontrar uma resposta para isso. Eu tenho duas perguntas

  1. Como você cria uma matriz ou coleção no XAML. Eu tenho uma matriz que quero ficar lá e amarrar a uma caixa de combinação. Minha primeira idéia foi colocar um itemsControl em um dicionário de recursos, mas a fonte de itens de uma caixa combinada espera um IEnumerable para que isso não funcionasse.

Aqui está o que eu tentei no meu dicionário de recursos e nem funciona

<ItemsControl x:Key="stateList">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</ItemsControl>
<ItemsControl x:Key="stateList2">
    <ComboBoxItem>AL</ComboBoxItem>
    <ComboBoxItem>CA</ComboBoxItem>
    <ComboBoxItem>CN</ComboBoxItem>
</ItemsControl>

E aqui está como eu me vi

<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}"  >

                    </ComboBox>

Editar: Atualizado

Eu consegui esta primeira parte para funcionar dessa maneira

 <col:ArrayList x:Key="stateList3">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</col:ArrayList>

No entanto, prefiro não usar uma lista de matrizes, gostaria de usar uma lista genérica, por isso, se alguém souber como, por favor me avise.

Atualização de edição: acho que Xaml tem suporte muito limitado para genéricos, então talvez uma lista de matrizes seja a melhor que eu posso fazer agora, mas eu ainda gostaria de ajuda na segunda pergunta se alguém tiver um Anser

2º. Eu tentei referenciar um dicionário de recursos mesclados no meu XAML e tive problemas porque, na janela. Resultas, eu tinha mais do que apenas o dicionário, por isso exigia que eu adicione a chave x:. Depois de adicionar a chave, o sistema não pode mais encontrar os itens no meu dicionário de recursos. Eu tive que mover o dicionário mesclado para a grade. Idealmente, gostaria de fazer referência ao dicionário mesclado no app.xaml, mas eu tenho o mesmo problema

Aqui está algum código de amostra. Esta primeira parte exigiu uma chave x: compilar porque eu tenho conversor e reclamou que cada item deve ter uma chave se houver mais de um

<UserControl.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Eu tive que mudar para isso

<UI:BaseStep.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />             
</UI:BaseStep.Resources>
<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourcesD.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>
</Grid>

obrigada

Foi útil?

Solução

Até onde eu entendo o seu problema, você deseja vincular um ComboBox (ou uma caixa de listagem) com uma matriz de itens, certo? Se você deseja itens de alguma fonte de dados externos, basta usar a propriedade Handy DataContext. Pesquise o MSDN por mais sobre isso. No entanto, se você quiser uma coleção manual, faça -o da seguinte:

Crie sua própria classe:

public class StringCollection : ObservableCollection<string> { }

E agora use assim:

<Window.Resources>
    <local:StringCollection x:Key="stringCollection">
        <sys:String>Hello</sys:String>
        <sys:String>World</sys:String>
    </local:stringCollection>
</Window.Resources>

...

    <ListBox
        Margin="15"
        ItemsSource="{StaticResource stringCollection}" />

Ou, se você quiser uma coleção mais genérica, crie uma classe como esta:

public class ObjectCollection : ObservableCollection<object> { }

e use assim:

    <local:ObjectCollection x:Key="objectCollection">
        <sys:String>Hello</sys:String>
        <TextBlock>World</TextBlock>
        <sys:Int32>12345</sys:Int32>
    </local:ObjectCollection>

    ...

    <ComboBox
        Margin="15"
        ItemsSource="{StaticResource objectCollection}" />



Você também pode querer fazer uso de algumas classes embutidas como Int32Collection isso implementa IEnumerable. Você pode usá -los diretamente como recurso.


o Resources propriedade de algum FrameworkElement Curti Window, UserControl, ou Application) é do tipo ResourceDictionary não coleção de dicionários de recursos! então você não pode faça assim:

<UserControl.Resources>

    <!-- The first RD -->
    <!--<ResourceDictionary>
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    </ResourceDictionary>-->

    <!-- Second RD!!! -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Em vez disso, faça assim:

<UserControl.Resources>

    <!-- 
        There should be only 1 main RD, 
        Merge other RDs, if any
     -->
    <ResourceDictionary>

        <!-- First Resource -->
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />

        <!-- Second Resource -->
        <ResourceDictionary.MergedDictionaries>
            <!-- Now, there can be multiple RDs -->
            <ResourceDictionary Source="/ResourcesA.xaml" />
            <ResourceDictionary Source="/ResourcesB.xaml" />
            <ResourceDictionary Source="/ResourcesC.xaml" />
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</UserControl.Resources>

Espero que isto ajude.
Cumprimentos,
Mihir Gokani

Outras dicas

Por favor, me corrija se eu estiver errado, mas acho que você quer algo assim?

<Grid.Resources>
  <local:MyCustomCollection x:Key="local:MyCustomCollection"/>
</Brid.Resources>

No topo da sua janela, você teria uma propriedade:

xmlns:local="clr-namespace:MyNamespace"

E dentro do seu código que você teria:

MyCustomCollection  custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection;

A ligação aconteceria em um controle com uma propriedade algo assim:

ItemsSource="{StaticResource MyCustomCollection}"

Para os recursos, você só precisa aumentar seu conversor adicional para o recém -declarado RecursoCectionário:

<App.Resources> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 

Se você adicionar o dicionário de recursos dentro dos recursos da Window, não poderá acessá -lo em todos os lugares; em vez disso, adicionará os recursos do "aplicativo" (consulte o arquivo app.xaml).

<App.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

Isso estará disponível em todos os objetos WPF, independentemente de criar qualquer hierarquia de herança.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top