如何更改特定单元格的 DataGridTemplateColumn DataTemplate 元素的属性
How can I change the properties of a DataGridTemplateColumn DataTemplate Element for a specific cell
我刚才创建的 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" return 每次都是 null。所以我的问题是如何分别更改每一行中的 DatePicker?
提前致谢!
我认为你应该可以这样做:
var contentPresenter = DgvProjectTaskList.Columns[4].GetCellContent(item);
var datePicker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
datePicker.IsEnabled = true;
GetCellContent()
returns 一个 ContentPresenter
其中第一个 child 是 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;
}
我终于解决了这个问题,方法是在 ViewModel 中创建一个布尔值并将其绑定到 DatePicker 的 isEnabled 属性。
我刚才创建的 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" return 每次都是 null。所以我的问题是如何分别更改每一行中的 DatePicker? 提前致谢!
我认为你应该可以这样做:
var contentPresenter = DgvProjectTaskList.Columns[4].GetCellContent(item);
var datePicker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
datePicker.IsEnabled = true;
GetCellContent()
returns 一个 ContentPresenter
其中第一个 child 是 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;
}
我终于解决了这个问题,方法是在 ViewModel 中创建一个布尔值并将其绑定到 DatePicker 的 isEnabled 属性。