[ad_1]
在 DataGridTemplateColumn 中使用自定义控件时绑定不起作用
我的职责是提供一个可用于从项目列表中选择多个项目的控件。 这些项目是分类标签。 该对象是一个标签。 它具有三个属性(ID、名称、描述)。 这是对象:
public class Tag : ObservableObject { private int tagID; private string tagName; private string description; #region Properties public int TagID { get => tagID; set => SetProperty(ref tagID, value); } public string Name { get => tagName; set => SetProperty(ref tagName, value); } public string Description { get => description; set => SetProperty(ref description, value); } public Tag() { } }
我创建了一个名为 TagSelect 的 CustomControl,它将 List
我需要帮助解决的问题是这样的。 当我单独测试此控件(就像网格中的元素一样)时,它可以正常工作。 不过,最初的目标是在 DataGridColumn 中使用。 当我构建 DataGridTemplateColumn 并在 CellEditingTemplate 中使用 TagSelect 控件时,SelectedTags 的 DP 为空。 我知道它是 null,因为它在 OnApplyTemplate 方法中的断点处的 TagSelect 控件内显示 (== null)。
我构建了一个小项目来驱动此控件的测试(TagBindExample)。 可以访问
https://github.com/hardoverton/TagBindExample
解决方案的一些相关部分:
以下是该控件单独位于网格中时的使用方式:
<cc:TagSelect Width="175" SelectedTags="{Binding SomeTags}" /> <cc:TagSelect Width="175" SelectedTags="{Binding OtherTags}" />
DataGrid 的定义方式如下:
<DataGrid x:Name="TestGrid" Grid.Row="3" AutoGenerateColumns="False" ItemsSource="{Binding DataEntries}" Margin="80,0,80,0" Grid.ColumnSpan="2"> <DataGrid.Columns> <DataGridTextColumn Width="40" Binding="{Binding ID}" Header="ID" /> <DataGridTextColumn Width="200" Binding="{Binding Name}" Header="Name" /> <DataGridTemplateColumn Width="175" Header="Tags"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding TagString}" Width="175"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <cc:TagSelect Width="175" SelectedTags="{Binding Tags}" /> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
DataGrid 的测试数据是 ObservableCollection
SomeTags List: 3 - Boogie 1 - Accord OtherTags List: 5 - Christmas Gifts 6 - Data Science 7 - Envoy DataEntries Collection: 0 - First Person, Tags: 7 - Envoy 2 - Bathroom Project 1 - Second Person, Tags: 5 - Christmas Gifts 1 - Accord 3 - Boogie 8 - Fund-House 2 - Third Person, Tags: 5 - Christmas Gifts 6 - Data Science 7 - Envoy
以下是 DataEntry 的定义:
public class DataEntry : ObservableObject { private int id; public int ID { get => id; set => SetProperty(ref id, value); } private string? name; public string? Name { get => name; set => SetProperty(ref name, value); } private List<Tag> tags; public List<Tag> Tags { get => tags; set => SetProperty(ref tags, value); } private string tagString; public string TagString { get => tagString; set => SetProperty(ref tagString, value); } public DataEntry() { tags = new List<Tag>(); }
以下是 TagSelect 控件中 SelectedTags 依赖属性的定义:
public List<Tag> SelectedTags { get { return (List<Tag>)GetValue(SelectedTagsProperty); } set { SetValue(SelectedTagsProperty, value); } } public static readonly DependencyProperty SelectedTagsProperty = DependencyProperty.Register("SelectedTags", typeof(List<Tag>), typeof(TagSelect), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
仅当在 DataGridTemplateColumn 中使用时,DP 为 null。 我不懂为什么。 由于某种原因,它没有看到 DataGridRow 的 DataContext。 记录中单元格的数据是一个 List
public override void OnApplyTemplate() { base.OnApplyTemplate(); if (SelectedTags == null) SelectedTags = new List<Tag>(); <- break here .... .... FullTagSet = TagData.TagList; LoadSelections(); }
我尝试过的:
我尝试了通过 StackOverFlow、CodeProject、GitHub 以及搜索引擎的任何其他参考资料研究这个问题时发现的所有合理建议。
我添加了要在 CellTemplate 中使用的 TagString 绑定,只是为了看看是否能够正确引用 DataGridRow。 它按预期工作。
我在 CellEditingTemplate 中做错了什么,导致我无法
访问每个记录中的 List
我是否试图做一些 DataGridTemplateColumn 不允许的事情?
如果是这样,我应该考虑采用另一种方法来满足要求吗?
[ad_2]
コメント