gpt4 book ai didi

c# - WPF 动态 DataGrid 绑定(bind)值从集合中的嵌套对象到自定义 DataGridCell 模板

转载 作者:行者123 更新时间:2023-12-03 10:45:57 27 4
gpt4 key购买 nike

我已经花了半天多的时间来整理这项任务,而对于一棵树,我看不到森林。

其目的是将数据 (DataGrid) 显示为具有动态列数的多个网格,其中每个单元格(不仅仅是列)可以或不可以通过两种方式绑定(bind)进行编辑。

我想避免使用代码背后的方法,我相信 xaml 可以为我提供我需要的东西。另一件事是 mvvm 注入(inject)。

让我们让它变得简单,首先为一个表做绑定(bind)。

我的第一个困难是创建 DataTable 但这不能用于单元格可编辑级别。然后我创建了对象集合的集合(对于一个表-> 多行-> 多列)。

public class DataGridCell : BaseViewModel
{
public string Value
....
public bool IsEditable
....

}

然后我有另一个虚拟机,它代表一个包含虚拟机的表(网格)
public class DataGridItem : BaseViewModel
{
public string TableName
{
....
}

public ObservableCollection<ObservableCollection<DataGridCell>> Data
{
....
}
}

然后我的 xaml 看起来像这样
<DataGrid ItemsSource="{Binding Path=Data}" AutoGenerateColumns="True">
<DataGrid.Resources>

<DataTemplate x:Key="ReadonlyCellTemplate">
<TextBlock Text="{Binding Value}" />
</DataTemplate>

<DataTemplate x:Key="EditableCellTemplate">
<TextBox Text="{Binding Value}" />
</DataTemplate>

</DataGrid.Resources>
<DataGridTemplateColumn CellTemplate="{StaticResource ReadonlyCellTemplate}">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>

<ContentPresenter x:Name="Presenter" ContentTemplate="{StaticResource ReadonlyCellTemplate}" />
<DataTemplate.Triggers>

<DataTrigger Binding="{Binding IsEditable, PresentationTraceSources.TraceLevel=High}" Value="True">
<Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource EditableCellTemplate}" />
</DataTrigger>

</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid>

这个想法是动态选择哪个单元格将由数据输入控件填充,哪个不填充。
问题是绑定(bind)。我无法弄清楚如何绑定(bind)集合中的具体单元格元素。

感谢您提供任何可能的建议

最佳答案

我希望现在还不算晚,但这就是我解决将单元格绑定(bind)到动态数据的问题的方法:

Problems binding to a the content of a WPF DataGridCell in XAML

(根据要求添加代码)

关于c# - WPF 动态 DataGrid 绑定(bind)值从集合中的嵌套对象到自定义 DataGridCell 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26109757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com