2011-10-10 12 views
13

Recientemente he encontrado un problema donde tengo un ObservableCollection vinculado a un ListView. La gente es una estructura que he escrito. Siempre que establezca los valores de los objetos People antes de la vinculación, todo parece funcionar bien. Sin embargo, cuando intento establecer los valores desde la GUI en tiempo de ejecución, los objetos subyacentes no parecen reflejar el cambio.¿Por qué no funciona el enlace a una estructura?

Finalmente superé este problema simplemente cambiando People de una estructura a una clase. Ningún otro cambio fue necesario.

¿Puede alguien explicarme por qué es esto?

+5

sabes la diferencia entre la estructura y la clase? –

Respuesta

21

Su enlace obtiene una copia de struct ya que las estructuras se pasan por valor a los métodos. Si el enlace actualiza algo; una copia en la memoria en algún lugar se está modificando y, por lo tanto, el objeto original suyo no se actualiza.

2

Porque la estructura se pasa por valor al control, por lo tanto, cuando realiza cambios en la interfaz de usuario, WPF escribe los cambios en una instancia diferente de People.

Cámbielo a una clase y funcionará.

A menos que comprenda completamente el propósito del struct, sugiero no usarlo.

2

la vista de lista es un ItemsControl y funciona tanto en modo directo en el que se rellenan de artículos es por declarar objetos ListViewItem severl en XAML o en el modo ItemsSource donde se define un enlace en la propiedad ItemsSource

See this Dr. WPF article for a good explanation.

De cualquier manera, ListView.Items es una Colección de artículos que es una CollectionView, es decir, Artículos no es la colección real que usted suministra a la propiedad ItemsSource sino una copia normalizada de la colección que usted proporcionó que permite al marco, por ejemplo, acceder a IEnumerable subyacente por índice aunque IEnumerable no proporciona un indexador.

Dado que ListView utiliza una copia, cuando utiliza una colección de instancias de Clase puede hacer copias de las referencias, ambas referencias apuntan al mismo objeto en la memoria para que los efectos de los valores cambiantes en una de las referencias sean visibles a través de la otra referencia, pero cuando está utilizando una colección de estructuras que son tipos de valores, tiene que hacer copias de los valores, en lugar de tener dos referencias que apuntan al mismo objeto, entonces tiene dos objetos de tipo de valor distintos.

1

Para todos los interesados ​​en este tema: Lo tengo en ejecución, con un Combobox y ObjectDataProvider. El "ItemsSource" es la estructura, pero el "SelectedItem" está escrito en otro lugar. aquí está:

<!--resources--> 
    <ObjectDataProvider x:Key="StructValues" 
         MethodName="GetValues" 
         ObjectType="{x:Type local:MyStruct}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:MyStruct" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

    <ComboBox Margin="0,5" 
         VerticalAlignment="Center" 
         ItemsSource="{Binding Source={StaticResource StructValues}}"/> 

y es así como la estructura se parece a:

public struct MyStruct 
{ 
    public const string A = "A"; 
    public const string B = "B"; 
    public const string C = "C"; 

    public static IEnumerable GetValues(Type type) 
    { 
     List<String> retVals = new List<string>(); 
     FieldInfo[] fi = type.GetFields(); 
     foreach (FieldInfo info in fi) 
     { 
      retVals.Add(info.Name); 
     } 
     return retVals; 
    } 
} 
Cuestiones relacionadas