c# - 如何将列表绑定到 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 并将列表绑定到它。
要不然
您可以按照以下步骤将每个属性连接为逗号分隔的字符串。
- 您的班级成员是字段而不是属性。我不确定这是否也是一个问题,但是当我将它们更改为属性时,我可以看到列中出现了一些东西。
所以我做了以下更改,
- 将类级别的公共字段更改为属性 - 您可以忽略这一点,因为我绑定到 DataGridTextColumn 的实际数据是我的 MonthModel 类的“星期日”(一个属性)。所以这样做不是很强制性,但你的“星期天”应该是一个属性。
有关更新的课程,请参见下文。
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 的可见性变为可见(希望您在第一点错过了这一点),我现在将“星期日”属性绑定到 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。
改进您为类、属性、对象提供的命名约定。
希望这可以帮助。如果存在任何问题,请尝试并让我们知道。
推荐阅读
- python - 在 FastAPI 中测试 Pydantic 设置
- arrays - 如何在 Swift(Xcode) 中随机化一个数组
- python - AI-CNN Python 将我自己的数据加载到 Python
- javascript - Vue 组件如何单击按钮或选中复选框以使用函数更改工具提示文本和按钮颜色?
- javascript - 如何访问基于构造函数构建的对象的值的总和
- debugging - 这是弹出窗口的正确代码吗?
- r - 为功率分析的每次迭代创建新数据集
- c++ - 我的模板类的 ctor 将可调用对象作为参数,但不能从中初始化?
- python - 接口类型的内存视图与 python slice 对象
- amazon-web-services - 为联合身份 AWS 创建长期凭证