繁体   English   中英

如何将列表绑定到 wpf 中的数据网格列

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

您的代码有几个问题。

  1. 您已将数据网格可见性设置为“隐藏”。 因此,您无法在窗口中看到任何内容。

  2. 您正在尝试将集合绑定到 TextBlock。 这也是你的问题。

不能将集合绑定到 TextBlock。 如果您想实现这一点,那么您可以在 DataGrid 单元格中有一个 ComboBox 并将列表绑定到它。

要不然

您可以按照以下步骤操作,其中我将每个属性连接为逗号分隔的字符串。

  1. 您的类成员是字段而不是属性。 我不确定这是否也是一个问题,但是当我将它们更改为属性时,我可以在列中看到一些内容。

所以我做了以下更改,

  1. 将类级别的公共字段更改为属性 - 您可以忽略这一点,因为我绑定到 DataGridTextColumn 的实际数据是我的 MonthModel 类的“Sunday”(一个属性)。 所以这样做不是强制性的,但你的“星期日”应该是一个属性。

请参阅下面的更新类。

    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 -

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM