2011-01-19 14 views
12

Si quiero vincular algo como un combobox en el código subyacente, no tengo ningún problema. Algo como:¿Es posible hacer un List <string> un recurso estático en xaml?

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

comboBox1.ItemSource = strings; 

Por lo que puedo decir, no hay una manera rápida y sucia de hacer esto en XAML. Para todos los elogios que wpf está recibiendo por su enlace de datos súper simple, algo así de simple parece mucho más fácil de hacer en C#. ¿Hay una manera más fácil de hacer esto que crear envoltorios de DependencyProperty y agregarlos como recursos sin mucha ayuda de intellisense o todo lo que va en ObservableCollections? Entiendo que no es imposible, pero me falta algo si una tarea tan simple parece tan profunda ...

EDITAR: Para aclarar, el tema es agregar Listas dinámicas, no matrices estáticas. Es muy fácil agregar elementos manualmente, como muchos han señalado.

+1

WPF recibe elogios por el hecho de que permite segmentar la lógica lejos del diseño y demás, no porque pueda hacer cualquier cosa. –

+0

@ Decepción: esto no es demasiado loco ... ciertamente no es "nada ni nada". Es simple y el tema de la conveniencia de una de las tareas más comunes en la creación de aplicaciones. –

+0

Sé que no es una locura; pero una vez que comienzas a ser complaciente y trabajas a lo largo de las líneas de "Voy a incorporar este dato en la interfaz de usuario ..." ¿quién sabe dónde terminará? Y si hablamos de "datos" que esencialmente se pueden considerar parte de la interfaz de usuario, como una lista de opciones desplegables que son comunes y constantes, entonces generalmente se utiliza el contenedor que se abstrae y se reutiliza. No estoy llegando a usted, la pregunta o el método, simplemente diciendo algunas cosas, por cierto. –

Respuesta

3

de que hay:

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

hay otras sintaxis en función de su objetivo que son casi tan simple - utilizando recursos o itemssources en línea, o incluso datos agrupados .. xml datos. No levante las manos con frustración porque lo primero que intentó no fue fácil, en mi opinión, wpf vale la curva de aprendizaje.

WPF recibe elogios porque hace que la separación de los elementos visuales del comportamiento mucho más fácil que las formas de las ventanas, y porque hace que la creación de efectos visuales agradables mucho más fácil, no porque hace que sea más fácil hacer ejemplos triviales. Sin embargo, en este caso, es es más fácil de hacer el ejemplo trivial.

Con su edición ¿De dónde quiere sacarlas? No tiene que crear propiedades de dependencia o colecciones observables de ninguna manera. Una propiedad simple de lista servirá (prefiero usar una collectionviewsource en el xaml en ese caso).Además, no olvide que no necesita para obtener y usar todo XAML si lo odia. Pero si diseñas para WPF en lugar de hacerlo a pesar de ello, encontrarás muchas tareas (como esta) fáciles.

+0

Disculpe, no estaba claro, pero estoy buscando una forma de agregar contenido dinámico (por ejemplo, desde una lista donde no se conocen los valores). –

+2

@Prof Plum Supongo que no entiendo: ¿quieres que el xaml contenga un recurso estático sin código, pero quieres que los valores sean dinámicos? ¿Dónde/cuándo se establecerán los valores? –

+0

Gracias, ¿qué implica el método collectionviesource? Si conoce algún enlace que demuestre un uso conciso además de MSDN, sería bastante útil. –

1

que puede hacer:

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

Y también existe sintaxis para declarar (e implícitamente la creación) de datos, por ejemplo, en una sección de recursos.

Tal vez pueda señalar un escenario más completo, con los requisitos y las limitaciones?

+0

editado para mostrar lo que realmente estaba entendiendo: cuando los elementos de la Lista son desconocidos. –

+1

Ahora parece que desea mezclar imperativo C# en el declarativo XAML. Si acaba de convertir la función en una propiedad, ya está hecho. –

5

¿Estás buscando algo como esto:

<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> 

Si sólo desea definir algunos elementos de una lista, mire la solución de Henk Holterman. Por cierto, puede declarar la matriz también como un recurso y para otros tipos.

actualización

Parece que ha cambiado su pregunta. Sin embargo, ahora no entiendo cuál es tu deseo. Si desea enlazar una colección que tiene en su código subyacente, a continuación, hacer que una propiedad pública que devuelve esta colección, establecer el DataContext al objeto que expone esta propiedad y definir una unión en XAML:

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

Esperanza entendí su pregunta correcta ...

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

Preferiría tener las xmlns definidas en el nivel de la ventana, p. '' en lugar de en los recursos de la matriz. Este es un estándar XAML sólido y muy limpio. – cod3monk3y

+0

Solo un aviso, en su xaml tiene , pero debería ser . No puedo hacer la edición ya que es menos de 6 caracteres. – edhedges

+0

@edhedges: Reparado. Gracias. – Nawaz

Cuestiones relacionadas