2012-02-09 27 views
5

Estoy intentando vincular un elemento listview a un miembro de una estructura, pero no puedo hacerlo funcionar.Enlace a una estructura

La estructura es bastante simple:

public struct DeviceTypeInfo 
{ 
    public String deviceName; 
    public int deviceReferenceID; 
}; 

en mi modelo de vista que mantienen una lista de estas estructuras y quiero obtener el "DEVICENAME" que se mostrará en un cuadro de lista.

public class DevicesListViewModel 
{ 
    public DevicesListViewModel() 
    { 

    } 

    public void setListOfAvailableDevices(List<DeviceTypeInfo> devicesList) 
    { 
     m_availableDevices = devicesList; 
    } 

    public List<DeviceTypeInfo> Devices 
    { 
     get { return m_availableDevices; } 
    } 

    private List<DeviceTypeInfo> m_availableDevices; 
} 

He intentado lo siguiente pero no puedo hacer que el enlace funcione, ¿tengo que usar el origen de mi familia?

<ListBox Name="DevicesListView" Grid.Column="0" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="10" MinHeight="250" MinWidth="150" ItemsSource="{Binding Devices}" Width="Auto"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Text="{Binding DeviceTypeInfo.deviceName}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Respuesta

9

Debe crear los miembros en las propiedades struct.

public struct DeviceTypeInfo 
{  
    public String deviceName { get; set; }  
    public int deviceReferenceID { get; set; } 
}; 

me encontré con una situación similar ayer: P

EDIT: Ah, sí, y al igual que Jesse dijo, una vez que los convierten en propiedades, tendrá que configurar el evento INotifyPropertyChanged.

+0

gracias, se me olvidó que también tenían que ser propiedades –

3

Creo que necesita getters y setters. También es posible que deba implementar INotifyPropertyChanged.

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
4

de DataContext Su TextBlock es un objeto de tipo DeviceTypeInfo, por lo que sólo necesitan de obligar a deviceName, no DeviceTypeInfo.deviceName.

<DataTemplate> 
    <StackPanel Orientation="Vertical"> 
     <TextBlock Text="{Binding deviceName}"/> 
    </StackPanel> 
</DataTemplate> 

Además, debe ser vinculante a Properties, no campos. Puede cambiar sus campos a propiedades agregando { get; set; } como townsean's answer sugiere

+0

Eso es una buena opción. Pasé por alto la parte deviceName. : P –

+0

@townsean lol Te di un +1 de todos modos porque resolviste parte del problema. – Rachel

Cuestiones relacionadas