Я собираюсь отобразить список данных, используя listview, класс данных содержит следующие элементы:
class MyData
{
static Random rnd = new Random();
public int id { get; set; }
public string name { get; set; }
public bool selected { get; set; }
private LED[] LEDs = new LED[21];
private byte[] servos = new byte[21];
}
Ожидается, что данные будут отображаться в табличном формате, как показано ниже,
{selected} {id} {name} {servo[1]} {servo[2]} ......
(серво [0] должно быть скрыто)
с расположением каждого столбца:
- {selected] : checkbox
- {id} : right alignment
- {name] : left alignment
- {servo} : right alignment, with background based on LED setting
Я построил ListView, как показано ниже
<ListView x:Name="lvData" FontSize="13" Background="LightGoldenrodYellow" Margin="0,0,0,0" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn >
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding selected}" Checked="Selection_Changed" Unchecked="Selection_Changed" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="id" Width="60">
<GridViewColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding id}" TextAlignment="Right" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="name" Width="100" DisplayMemberBinding="{Binding name}"/>
<GridViewColumn Header="s01" Width="35">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid Background="{Binding Path=LED01}" Margin="-5,0,-5,0">
<Label Margin="0,0,0,0" Content="{Binding Path=S01}" HorizontalContentAlignment="Right"></Label>
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="s02" Width="35">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid Background="{Binding Path=LED02}" Margin="-5,0,-5,0">
<Label Margin="0,0,0,0" Content="{Binding Path=S01}" HorizontalContentAlignment="Right"></Label>
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
:
{repeat for s03...s20}
:
</GridView>
</ListView.View>
</ListView>
С некоторыми свойствами, добавленными в мой класс данных:
public string LED01 { get { return GetLED(1); } }
public string S01 { get { return GetServo(1); } }
public string LED02 { get { return GetLED(2); } }
public string S02 { get { return GetServo(2); } }
И два метода GetLED & GetServo возвращают цвет и отображение на основе значения светодиодов и сервоприводов массива с заданным индексом.
Кажется, действительно глупо, что я повторял блок GridViewColumn много раз, и было создано 40 фиктивных свойств, поскольку он не может напрямую связываться с методом.
Могу ли я узнать, есть ли какой-нибудь простой способ построения списка?
На самом деле размер массива не является фиксированным, 21 - это максимальный размер.
Я хотел бы знать, может ли он динамически строить столбец, чтобы его можно было создать на основе фактического размера, и эти повторяющиеся столбцы можно сделать в цикле. И установите фоновое содержимое и данные на основе метода класса, чтобы я мог установить значение GetLED (?) И GetServo (?) Напрямую, не создавая для него фиктивное свойство.
Заранее спасибо.