2012-02-09 41 views
5

Tôi đang cố gắng ràng buộc một mục listview với một thành viên của một cấu trúc, nhưng tôi không thể làm cho nó hoạt động.Ràng buộc vào một cấu trúc

Cấu trúc khá đơn giản:

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

trong mô hình quan điểm của tôi tôi giữ một danh sách của các cấu trúc và tôi muốn để có được những "DEVICENAME" sẽ được hiển thị trong một hộp danh sách.

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

Tôi đã thử làm như sau nhưng tôi không thể bắt buộc phải làm việc, tôi có cần sử dụng nguồn gốc không?

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

Trả lời

9

Bạn cần phải tạo thành viên trong thuộc tính cấu trúc.

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

tôi chạy vào một tình huống tương tự hôm qua: P

EDIT: Oh yeah, và giống như Jesse nói, một khi bạn biến chúng thành tài sản, bạn sẽ muốn thiết lập sự kiện INotifyPropertyChanged.

+0

cảm ơn, tôi quên rằng chúng phải là thuộc tính quá –

3

Tôi nghĩ bạn cần getters và setters. Bạn cũng có thể cần triển khai INotifyPropertyChanged.

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

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

của DataContext TextBlock của bạn là một đối tượng kiểu DeviceTypeInfo, vì vậy bạn chỉ cần liên kết với deviceName, không DeviceTypeInfo.deviceName.

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

Ngoài ra, bạn phải ràng buộc với Properties, không phải là trường. Bạn có thể thay đổi trường của mình thành thuộc tính bằng cách thêm { get; set; } vào chúng như townsean's answer gợi ý

+0

Đó là một điều tốt. Tôi đã bỏ qua phần deviceName. : P –

+0

@townsean lol Tôi đã gửi cho bạn một +1 anyways vì bạn đã giải quyết được một phần vấn đề. – Rachel

Các vấn đề liên quan