Search code examples
wpflistviewdata-binding

Binding to a structure


I am trying to bind a listview item to a member of a structure, but I am unable to get it to work.

The structure is quite simple:

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

in my view model I hold a list of these structures and I want to get the "deviceName" to be displayed in a list box.

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

I have tried the following but I can't get the binding to work, do I need to use relativesource?

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

Solution

  • You need to make the members in the struct properties.

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

    I ran into a similar situation yesterday :P

    EDIT: Oh yeah, and like Jesse said, once you turn them into properties, you'll want to set up the INotifyPropertyChanged event.