Привязка к структуре - PullRequest
       2

Привязка к структуре

7 голосов
/ 09 февраля 2012

Я пытаюсь привязать элемент списка к члену структуры, но не могу заставить его работать.

Структура довольно проста:

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

в моей модели представления у меня есть список этих структур, и я хочу, чтобы «deviceName» отображалось в списке.

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

Я пробовал следующее, но не могу заставить работать привязку, нужно ли мне использовать родственник?

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

Ответы [ 3 ]

15 голосов
/ 09 февраля 2012

Вам нужно сделать члены в свойствах структуры.

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

Я вчера столкнулся с подобной ситуацией: P

РЕДАКТИРОВАТЬ: О да, и, как сказал Джесси, как только вы превратите их в свойства, вы захотите настроить событие INotifyPropertyChanged .

4 голосов
/ 09 февраля 2012

Ваш TextBlock DataContext является объектом типа DeviceTypeInfo, поэтому вам нужно только привязать к deviceName, а не DeviceTypeInfo.deviceName.

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

Кроме того, вы должны быть привязаны к Properties, а не к полям.Вы можете изменить свои поля на свойства, добавив к ним { get; set; }, например Townsean's answer предлагает

3 голосов
/ 09 февраля 2012

Я думаю, вам нужны геттеры и сеттеры. Вам также может понадобиться реализовать INotifyPropertyChanged.

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...