2012-09-28 2 views
0

두 개의 열 Devicename 및 DeviceAddress가있는 listview가 있습니다. 나는 listview에 대한 observablecollection을 유지했다. MVVM 패턴을 사용하고 있습니다.ListView ObservableCollection 내의 모든 항목 추가 (WPF Mvvm)

보기 :

<ListView Height="100" ItemsSource="{Binding I2CDeviceList}" SelectedItem="{Binding SelectedI2CAddress, Mode=TwoWay}" Name="I2cDeviceList"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="I2C Device" Width="190" DisplayMemberBinding="{Binding I2CDevName}" /> 
         <GridViewColumn Header="I2C Device Address" Width="203" DisplayMemberBinding="{Binding I2CDeviceAddress}" /> 
        </GridView> 
       </ListView.View> 
</ListView> 

I2CDevicenameI2CDeviceAddress 내 모델 클래스의 일부입니다.

뷰 모델 :

public ObservableCollection<ModelClass> I2CDeviceList 
    { 
     get { return _I2CDeviceList; } 
     set 
     { 
      _I2CDeviceList = value; 
      NotifyPropertyChanged("I2CDeviceList"); 
     } 
    } 

항목은 & DeviceAddress 각각 장치 이름 안에 추가 할 :

{ T("Other"), T("0x00")}, 
{ T("TI Codec(TLV320AIC3104)"), T("0x18")}, 
{ T("Chip ID GPIO(PCA9500)"),T("0x20")}, 
{ T("GPIO - power rail control(PCA9555DB)"),T("0x24")}, 
{ T("Digital Potentiometer(AD5252)"),T("0x2C")}, 
{ T("Audience chip(eSxxx)"),T("0x3E")}, 
{ T("Spartan 3A FPGA(XC3SD3400A)"),T("0x40")},....... 

을 지금의 ViewModel 클래스의 생성자에서 나는 OBS 내부의 항목을 추가 할 수 있습니다 .Coll은 다음과 같습니다 :

public ObservableCollection<ModelClass> _I2CDeviceList = new ObservableCollection<ModelClass>() 
     {     
      new ModelClass() {I2CDevName = "Other", I2CDeviceAddress= "0x00"}, 
      new ModelClass() {I2CDevName = "TI Codec", I2CDeviceAddress = "0x18"}, .........    
     }; 

하지만 15 개의 항목을 추가하는 지루한 작업과 15 개의 항목 진술이 필요합니다. 그들의 말을 피하기 위해 단일 루프를 사용하여 항목을 추가 할 수 있습니까?

+0

먼저, 사용자가 제공 한이 목록을 그게 뭐야? 그 코드인가? – Markus

+0

당신이 내가 목록 안에 추가해야하는 항목을 abt라고 말하면, 나는 그 코드가 아니라고 말해야 만합니다. "기타", "0x00"은 각각 생성자에서 확인할 수있는 devicename과 deviceaddress입니다. –

+0

사실 내가 그런 식으로 코드가 아니라는 것을 이해했습니다. 이미 변수이거나 무언가 였거나 엑셀 시트, 데이터 시트 또는 VS 프로젝트 외부의 것에서 가져온 것 같습니다. – Markus

답변

4

그래서 ModelClass 생성자를 만들면 생성하기가 쉬워지고 동시에 값을 채울 수 있습니다.

public class ModelClass 
{ 
    public string I2CDevName { get; set; } 
    public string I2CDeviceAddress { get; set; } 

    public ModelClass(string DeviceName, string DeviceAddress) 
    { 
     this.I2CDevName = DeviceName; 
     this.I2CDeviceAddress = DeviceAddress; 
    } 
} 

이 다소 코드를 줄일 수 있지만, 여전히 입력이있을 것이다 :

public ObservableCollection<ModelClass> _I2CDeviceList = new ObservableCollection<ModelClass>() 
{     
    new ModelClass("Other","0x00"), 
    new ModelClass("TI Codec", "0x18"), ....... 
}; 

또는 당신이 "공장"전체 목록과 수익을 취하는 ModelClass의 정적 함수를 만들 수 있습니다 전체 ObservableCollection에이

그래서 당신은 당신이 가지고있는 목록의 일부를 변경해야하지만 목록이 더 나은 사용하려면 뭔가 (아마도 누군가가 더 나은 아이디어를 가지고 올 수 있음을 변경할 수 있지만, 경우 것

List<string[]> list = new List<string[]>() { new string[] {"Other", "0x00"}, 
              new string[] {"Audience chip(eSxxx), "0x3E"}, ... }; 

그리고 다음 ModelClass에 정적 기능 추가 : 다음

public class ModelClass 
{ 
    public string I2CDevName { get; set; } 
    public string I2CDeviceAddress { get; set; } 

    public ModelClass(string DeviceName, string DeviceAddress) 
    { 
     this.I2CDevName = DeviceName; 
     this.I2CDeviceAddress = DeviceAddress; 
    } 

    //Collection Factory 
    public static ObservableCollection<ModelClass> CreateCollection(List<string[]> models) 
    { 
     ObservableCollection<ModelClass> tmpColl = new ObservableCollection<ModelClass>(); 
     foreach (string[] s in models) 
     { 
      tmpColl.Add(new ModelClass(s[0],s[1])); 
     } 
     return tmpColl; 
    } 
} 

그리고 그냥 실행

List<string[]> list = new List<string[]>() { new string[] {"Other",...}, 
                     ...}; 
public ObservableCollection<ModelClass> _I2CDeviceList = ModelClass.CreateCollection(list); 

타다 ... 모든

+0

음, 똑같다. 당신이 말하는 정적 함수를 기다리는 중 :) –

+0

목록의 작은 부분으로 먼저 시도해보고 작동하지 않으면 돌아 오십시오. – Markus

+0

내가 언급 한 것처럼 코드를 추가했습니다.그러나 "공개 ObservableCollection _I2CDeviceList = ModelClass.CreateCollection (목록);" "목록"이 존재하지 않는다는 오류를 내게줍니다. 내 생성자에 목록 코드를 추가했습니다. –

관련 문제