簡體   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