在One Shot中添加ListView ObservableCollection中的所有项目(WPF Mvvm)

时间:2012-09-28 06:12:44

标签: c# wpf listview mvvm observablecollection

我有一个包含两列Devicename和DeviceAddress的列表视图。我为listview维护了一个observablecollection。我正在使用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>

I2CDevicename I2CDeviceAddress 都是我的模型类的一部分。

视图模型:

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

要在DeviceName&amp;中添加的项目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个项目的陈述。他们是否可以使用单个循环添加项目以避免许多陈述?

1 个答案:

答案 0 :(得分: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);

...多田