0

我有一个包含两列 Devicename 和 DeviceAddress 的列表视图。我为列表视图维护了一个 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 和 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 个项目的报表。他们是我可以使用单个循环添加项目以避免许多语句的一种方式吗?

4

1 回答 1

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

田...

于 2012-09-28T07:00:55.943 回答