[英]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.