【问题标题】:How can I change the properties of a DataGridTemplateColumn DataTemplate Element for a specific cell如何更改特定单元格的 DataGridTemplateColumn DataTemplate 元素的属性
【发布时间】:2019-07-03 13:49:33
【问题描述】:

我不久前创建的 DataGrid 有问题。 DataGrid 显示有关项目任务的信息。现在我必须使开始和结束日期列可编辑。为此,我使用以下代码更改了 DataGridTextColumn:

<DataGridTemplateColumn Header="Start"  Width="100" CanUserReorder="True">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <DatePicker 
        x:Name="DpStartDate" 
        SelectedDate="{Binding PlannedStart, StringFormat=\{0:dd.MM.yyyy\}}" 
        IsEnabled="False"/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

到目前为止一切顺利。现在的问题是,如果任务处于正确状态以更改日期,我必须检查每一行。如果是这样,我必须启用 DatePicker。在后面的代码中我是这样尝试的:

for(int _i = 0; _i < DgvProjectTaskList.Items.Count; _i++)
{
      switch (((TaskListViewModel) DgvProjectTaskList.Items[_i]).Task.State)
      {
         case TaskStates.InWork:
         {
            DatePicker _dpStart = DgvProjectTaskList.Columns[4].GetCellContent(_i) as DatePicker;
            _dpStart.IsEnabled = false;
            DatePicker _dpEnd = DgvProjectTaskList.Columns[5].GetCellContent(_i) as DatePicker;
            _dpEnd.IsEnabled = true;
            break;
         }
         case TaskStates.Done:
         {
            DatePicker _dpStart = DgvProjectTaskList.Columns[4].GetCellContent(_i) as DatePicker;
            _dpStart.IsEnabled = false;
            DatePicker _dpEnd = DgvProjectTaskList.Columns[5].GetCellContent(_i) as DatePicker;
            _dpEnd.IsEnabled = false;
            break;
         }
         default:
         {
            DatePicker _dpStart = DgvProjectTaskList.Columns[4].GetCellContent(_i) as DatePicker;
            _dpStart.IsEnabled = true;
            DatePicker _dpEnd = DgvProjectTaskList.Columns[5].GetCellContent(_i) as DatePicker;
            _dpEnd.IsEnabled = true;
            break;
         }
      }
}

问题是“GetCellContent”每次都返回 null。所以我的问题是如何分别更改每一行中的 DatePicker ? 提前致谢!

【问题讨论】:

    标签: c# wpf datagrid datagridtemplatecolumn


    【解决方案1】:

    我认为你应该可以这样做:

    var contentPresenter = DgvProjectTaskList.Columns[4].GetCellContent(item);
    var datePicker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
    datePicker.IsEnabled = true;
    

    GetCellContent() 返回一个ContentPresenter,第一个孩子是DatePicker


    如果你试试这个,它会起作用的:

      foreach (var item in DgvProjectTaskList.Items)
      {
        bool enable = item.Task.State != TaskStates.Done;
    
        var contentPresenter = Data.Columns[4].GetCellContent(item );
        var picker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
        picker.IsEnabled = enable;
        contentPresenter = Data.Columns[5].GetCellContent(item );
        picker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
        picker.IsEnabled = enable;
      }
    

    【讨论】:

    • 感谢 Henrik 的回答。不幸的是,我仍然从 GetCellContent(_i) 得到空值。我找到了另一个完美的解决方案。仍然非常感谢您的宝贵时间!
    • @A.Schneider:没关系:您是否从对GetCellContent() 的调用中删除了as DateTicker? - GetCellContent()不应该返回null
    • 是的,我删除了它。我今天早上用 object 而不是 var 尝试了一个类似的方法,但仍然得到了 null 作为回报。那个 null 是我无法帮助自己的大问题。也许它为空,因为我使用了 DataGridTemplateColumn?
    • @A.Schneider:啊,现在我知道出了什么问题:你应该这样做,而不是 _iDgvProjectTaskList.Columns[4].GetCellContent(DgvProjectTaskList.Items[_i])
    • @A.Schneider:完美。但您自己的解决方案与IsEnabled 绑定属性实际上是一种更清洁、更类似于 MVVM 的方法。
    【解决方案2】:

    我终于通过在 ViewModel 中创建一个 bool 并将其绑定到 DatePicker 的 isEnabled 属性来解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 2021-05-06
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      相关资源
      最近更新 更多