[英]How to bind a list to datagrid columns in wpf
我有一个包含 7 个列表字符串(sun、mon、tue...)的类。 在我的课堂上,我用一个月中的天数填充这些列表字符串。 然后我创建另一个列表并将结果添加到其中。 例如,如果我们取 2019 年 1 月,sun 的值将是 6、13、20 和 27。然后我将我的网格 itemsource 设为这个列表,但我的网格是空白的。 下面是我的代码,我错过了什么或做错了什么?
模型
public class MonthModel
{
//public string sun { get; set; }
public List<string> sun = new List<string>();
public List<string> mon = new List<string>();
public List<string> tue = new List<string>();
public List<string> wed = new List<string>();
public List<string> thu = new List<string>();
public List<string> fri = new List<string>();
public List<string> sat = new List<string>();
}
班级
switch (cTvDaySelected)
{
case "January":
int Year = DateTime.Today.Year;
int Month = 1;
int TotalDaysInMonth = DateTime.DaysInMonth(Year, Month);
for (int i = 1; i <= TotalDaysInMonth; i++)
{
DateTime dt = new DateTime(Year, Month, i);
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "sun")
{
dm.sun.Add(dt.ToShortDateString().Substring(0, 2));
//dm.sun = dt.ToShortDateString().Substring(0, 2);
}
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "mon")
{
// dm.mon = dt.ToShortDateString().Substring(0, 2);
dm.mon.Add(dt.ToShortDateString().Substring(0, 2));
}
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "tue")
{
// dm.tue = dt.ToShortDateString().Substring(0, 2);
dm.tue.Add(dt.ToShortDateString().Substring(0, 2));
}
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "wed")
{
//dm.wed = dt.ToShortDateString().Substring(0, 2);
dm.wed.Add(dt.ToShortDateString().Substring(0, 2));
}
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "thu")
{
//dm.thu = dt.ToShortDateString().Substring(0, 2);
dm.thu.Add(dt.ToShortDateString().Substring(0, 2));
}
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "fri")
{
//dm.fri = dt.ToShortDateString().Substring(0, 2);
dm.fri.Add(dt.ToShortDateString().Substring(0, 2));
}
if (dt.DayOfWeek.ToString().ToLower().Substring(0, 3) == "sat")
{
// dm.sat = dt.ToShortDateString().Substring(0, 2);
dm.sat.Add(dt.ToShortDateString().Substring(0, 2));
}
}
Month_Model.Add(dm);
// month_record.Items.Add(dm);
month_record.ItemsSource = Month_Model;
break;
}
xml
<DataGrid x:Name="month_record" MouseDoubleClick="Month_record_MouseDoubleClick"
IsReadOnly="True" Grid.ColumnSpan="9" Grid.Column="1" SelectionMode="Extended"
SelectionUnit="Cell" VerticalGridLinesBrush="Silver" HorizontalGridLinesBrush="Silver"
AutoGenerateColumns="False" ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Visible" Visibility="Hidden" Grid.Row="4" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding sun}" IsReadOnly="True" x:Name="colMSun" Header="Sunday"
Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=mon}" x:Name="colMMon"
IsReadOnly="True" Header="Monday" Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=tue}" x:Name="colMTue"
IsReadOnly="True" Header="Tuesday" Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=wed}" IsReadOnly="True"
x:Name="colMWed" Header="Wednesday" Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=thu}" IsReadOnly="True"
x:Name="colMThu" Header="Thursday" Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=fri}" x:Name="colMFri"
IsReadOnly="True" Header="Friday" Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=sat}" x:Name="colMSat"
IsReadOnly="True" Header="Saturday" Width="Auto">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="B">
<Setter Property="Background" Value="#C1D5F8"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
您的代码有几个问题。
您已将数据网格可见性设置为“隐藏”。 因此,您无法在窗口中看到任何内容。
您正在尝试将集合绑定到 TextBlock。 这也是你的问题。
不能将集合绑定到 TextBlock。 如果您想实现这一点,那么您可以在 DataGrid 单元格中有一个 ComboBox 并将列表绑定到它。
要不然
您可以按照以下步骤操作,其中我将每个属性连接为逗号分隔的字符串。
所以我做了以下更改,
请参阅下面的更新类。
public class MonthModel
{
public List<string> sun { get; set; } = new List<string>();
public List<string> mon { get; set; } = new List<string>();
public List<string> tue { get; set; } = new List<string>();
public List<string> wed { get; set; } = new List<string>();
public List<string> thu { get; set; } = new List<string>();
public List<string> fri { get; set; } = new List<string>();
public List<string> sat { get; set; } = new List<string>();
public string Sunday
{
get
{
return string.Join(",", sun);
}
}
}
注意:-我只创建了一个属性“Sunday”并将列表连接为“,”(逗号)分隔的字符串。
您可以为其他属性创建类似的方式或根据您的需要更改它。
方法 1 -
DataGrid 的可见性变为 Visible(希望你一开始就错过了这一点),我现在将“Sunday”属性绑定到 DataGridTextColumn
<DataGrid x:Name="month_record" MouseDoubleClick="month_record_MouseDoubleClick" IsReadOnly="True" Grid.ColumnSpan="9" Grid.Column="1" SelectionMode="Extended" SelectionUnit="Cell" VerticalGridLinesBrush="Silver" HorizontalGridLinesBrush="Silver" AutoGenerateColumns="False" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Visible" Visibility="Visible" Grid.Row="4"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Sunday}" IsReadOnly="True" x:Name="colMSun" Header="Sunday" Width="Auto"> <DataGridTextColumn.ElementStyle> <Style TargetType="{x:Type TextBlock}"> <Style.Triggers> <Trigger Property="Text" Value="Sunday"> <Setter Property="Background" Value="Red"/> </Trigger> </Style.Triggers> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid> }
注意:-我不会在这里粘贴所有列,但您必须自己完成。 我希望您能够通过上述更改进行更改。
我没有对您的方法的代码隐藏进行任何更改。
方法 2 -
如果您可以在数据网格列中有一个组合框,请参阅下面的小代码片段,
<DataGridTemplateColumn Header="Combobox">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedIndex="0" ItemsSource="{Binding sun}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
希望以上任何一种方法都可以帮助您。 如果没有,那么请让我们知道您关于如何表示 UI 的替代想法,以便我们可以有更好的想法。
建议:-
查看您的代码后,我的小建议
使用 observable 集合并将其作为源绑定到您的 DataGrid。
实现 INotifyPropertyChanged 以侦听值更改并自动刷新 UI。
改进您为类、属性、对象提供的命名约定。
希望这可以帮助。 请尝试一下,如果存在任何问题,请告诉我们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.