C# 一次性添加ListView ObservableCollection中的所有项目(WPF Mvvm)
我有一个包含两列Devicename和DeviceAddress的listview。我为listview维护了一个observablecollection。我使用的是MVVM模式 查看:C# 一次性添加ListView ObservableCollection中的所有项目(WPF Mvvm),c#,wpf,listview,mvvm,observablecollection,C#,Wpf,Listview,Mvvm,Observablecollection,我有一个包含两列Devicename和DeviceAddress的listview。我为listview维护了一个observablecollection。我使用的是MVVM模式 查看: <ListView Height="100" ItemsSource="{Binding I2CDeviceList}" SelectedItem="{Binding SelectedI2CAddress, Mode=TwoWay}" Name="I2cDeviceList">
<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>
public ObservableCollection<ModelClass> I2CDeviceList
{
get { return _I2CDeviceList; }
set
{
_I2CDeviceList = value;
NotifyPropertyChanged("I2CDeviceList");
}
}
现在,在viewmodel类的构造函数中,我可以在obs.Coll中添加如下项:
public ObservableCollection<ModelClass> _I2CDeviceList = new ObservableCollection<ModelClass>()
{
new ModelClass() {I2CDevName = "Other", I2CDeviceAddress= "0x00"},
new ModelClass() {I2CDevName = "TI Codec", I2CDeviceAddress = "0x18"}, .........
};
public observetecollection\u I2CDeviceList=new observetecollection()
{
新的ModelClass(){I2CDevName=“其他”,I2CDeviceAddress=“0x00”},
新的ModelClass(){I2CDevName=“TI Codec”,I2CDeviceAddress=“0x18”}。。。。。。。。。
};
但是添加15项是一项乏味的工作,我最终得到了15项声明。它们是我可以使用单个循环添加项以避免许多语句的一种方法吗?因此,要么为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"), .......
};
public observetecollection\u I2CDeviceList=new observetecollection()
{
新模型类(“其他”,“0x00”),
新模型类(“TI编解码器”,“0x18”)。。。。。。。
};
或者您可以创建一个“工厂”,ModelClass中的一个静态函数,它接受一个完整的列表并返回一个完整的ObservableCollection
因此,您必须更改列表中的一些内容,但如果您将其更改为(可能有人会想出更好的方法来更好地使用列表,但是:
List<string[]> list = new List<string[]>() { new string[] {"Other", "0x00"},
new string[] {"Audience chip(eSxxx), "0x3E"}, ... };
List List=new List(){new string[]{“Other”,“0x00”},
新字符串[]{“观众芯片(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;
}
}
公共类模型类
{
公共字符串I2CDevName{get;set;}
公共字符串I2CDeviceAddress{get;set;}
公共模型类(字符串DeviceName、字符串DeviceAddress)
{
this.I2CDevName=设备名称;
this.I2CDeviceAddress=设备地址;
}
//收集厂
公共静态ObservableCollection CreateCollection(列表模型)
{
ObservableCollection tmpColl=新的ObservableCollection();
foreach(模型中的字符串[]s)
{
tmpColl.Add(新模型类(s[0],s[1]);
}
返回tmpColl;
}
}
然后就跑:
List<string[]> list = new List<string[]>() { new string[] {"Other",...},
...};
public ObservableCollection<ModelClass> _I2CDeviceList = ModelClass.CreateCollection(list);
List List=new List(){new string[]{“Other”,…},
...};
PublicObservableCollection I2CDeviceList=ModelClass.CreateCollection(列表);
Tada…因此,要么为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"), .......
};
public observetecollection\u I2CDeviceList=new observetecollection()
{
新模型类(“其他”,“0x00”),
新模型类(“TI编解码器”,“0x18”)。。。。。。。
};
或者您可以创建一个“工厂”,ModelClass中的一个静态函数,它接受一个完整的列表并返回一个完整的ObservableCollection
因此,您必须更改列表中的一些内容,但如果您将其更改为(可能有人会想出更好的方法来更好地使用列表,但是:
List<string[]> list = new List<string[]>() { new string[] {"Other", "0x00"},
new string[] {"Audience chip(eSxxx), "0x3E"}, ... };
List List=new List(){new string[]{“Other”,“0x00”},
新字符串[]{“观众芯片(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;
}
}
公共类模型类
{
公共字符串I2CDevName{get;set;}
公共字符串I2CDeviceAddress{get;set;}
公共模型类(字符串DeviceName、字符串DeviceAddress)
{
this.I2CDevName=设备名称;
this.I2CDeviceAddress=设备地址;
}
//收集厂
公共静态ObservableCollection CreateCollection(列表模型)
{
ObservableCollection tmpColl=新的ObservableCollection();
foreach(模型中的字符串[]s)
{
tmpColl.Add(新模型类(s[0],s[1]);
}
返回tmpColl;
}
}
然后就跑:
List<string[]> list = new List<string[]>() { new string[] {"Other",...},
...};
public ObservableCollection<ModelClass> _I2CDeviceList = ModelClass.CreateCollection(list);
List List=new List(){new string[]{“Other”,…},
...};
PublicObservableCollection I2CDeviceList=ModelClass.CreateCollection(列表);
Tada…首先,你提供的这个列表是什么?是代码吗?如果你在谈论我必须添加到列表中的项目,那么我必须告诉你,它不是代码。“其他”,“0x00”分别是devicename和deviceaddress,您可以在构造函数中注意到。实际上,我理解它不是以这种方式编码的,我的意思是更像是如果它已经是一个变量或什么的,或者如果它是从excel表、数据表或VS项目之外的东西中获取的。首先,您提供的这个列表是什么代码?如果你说的是我必须添加到列表中的项目,那么我必须告诉你这不是代码。“其他”,“0x00”分别是devicename和deviceaddress,您可以在构造函数中注意到。实际上,我理解它不是以这种方式编码的,我的意思是更像是如果它已经是一个变量或什么的,或者如果它是从excel工作表、数据表或VS项目之外的其他内容中获取的,那么它是同一个你在说abt:)先用列表的一小部分试试,如果不起作用就返回。我添加了你提到的代码。但是“public observeCollection _I2CDeviceList=ModelClass.CreateCollection(list);”给了我一个错误,“list”不存在。我已在构造函数中添加了列表代码。好的,列表应放置在与创建_I2CDeviceList相同的位置,而不是在构造函数中。是的,在构造函数外部添加了_I2CDeviceList和list。错误:“A”