在数据网格模板列中使用自定义控件时绑定不起作用

[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 放入名为 SelectedTags 的依赖属性中。 这些是最初应显示为选定的标签。 然后,它构建所有可能标签的可观察集合,以便用户可以选择/取消选择相关标签。 它还管理原始 SelectedTags 列表的准确性。

我需要帮助解决的问题是这样的。 当我单独测试此控件(就像网格中的元素一样)时,它可以正常工作。 不过,最初的目标是在 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 DataEntries。 这是测试数据:

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 依赖属性的定义:

C#
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,就像它单独使用时一样。 我知道三个测试记录中的每一个都为空,因为我在控件的每个实例的以下位置中看到它。 没有显示绑定失败:

C#
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]

コメント

标题和URL已复制