我正在尝试将listview项绑定到结构的成员,但我无法让它工作。
结构非常简单:
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;
}
我尝试了以下但是我无法使绑定工作,我是否需要使用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>
答案 0 :(得分:14)
您需要在struct属性中创建成员。
public struct DeviceTypeInfo
{
public String deviceName { get; set; }
public int deviceReferenceID { get; set; }
};
昨天我遇到了类似的情况:P
编辑:哦,是的,就像杰西说的那样,一旦你把它们变成属性,你就会想要设置INotifyPropertyChanged事件。
答案 1 :(得分:4)
您的TextBlock的DataContext
是DeviceTypeInfo
类型的对象,因此您只需要绑定到deviceName
,而不是DeviceTypeInfo.deviceName
。
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding deviceName}"/>
</StackPanel>
</DataTemplate>
此外,您应该绑定到Properties
,而不是字段。您可以通过向townsean's answer建议
{ get; set; }
来将字段更改为属性
答案 2 :(得分:3)
我认为你需要吸气剂和制定者。您还可能需要实施INotifyPropertyChanged
。
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}