【问题标题】:(WPF) How can I find ancestor about two ItemsControl in code behind?(WPF) 如何在后面的代码中找到关于两个 ItemsControl 的祖先?
【发布时间】:2020-03-26 09:47:15
【问题描述】:

我有一个 ItemsControl(A)。 ItemSourece 是一个“帐户”类。它包含一些控件和另一个 ItemsControl(B)。

ItemsControl(B) 包含一些 CheckBox。它的 ItemSourece 是包含在“Account”类中的 ObservableCollection。 CheckBox 的内容绑定到内容。 CheckBox 的 IsChecked 绑定到 IsChecked。

现在,当我单击 CheckBox 时,我想获取“帐户”类中的 ID 和用户,但我不知道如何获取它们。 我已经尝试使用

    private void CheckBox_Click(object sender, RoutedEventArgs e)
    {
        CheckBox checkBox = sender as CheckBox;
        var parentElement = (ContentPresenter)VisualTreeHelper.GetParent(checkBox);           
    }

但它仍然无法获取父级。 尽管运行时可以显示 parentElement.VisualParent,但实际上它不起作用。

请帮帮我!谢谢!

【问题讨论】:

  • 当您将铸件放到ContentPresenter 时,您的var parentElement 会发生什么?如果错误的转换不会抛出异常,最好的情况是你得到 null。
  • 请提供一个具体的例子。 CheckBox_Click 是如何以及在哪里连接的?
  • @mm8 CheckBox_Click 是 CheckBox 事件,所以 CheckBox 中的数字如何由 ObservableCollection 决定。
  • @Mike 我添加了一些图片。我得到了很多 ContentPresenter 的属性,datacontext 是 CheckBox。
  • 我通过在ItemsControl(B)处添加PreviewMouseUp事件暂时解决了这个问题,并成功获取父级。但我认为这将是一个比这更好的答案。

标签: wpf checkbox code-behind itemscontrol findancestor


【解决方案1】:

@RickyChen - 我看到了你的问题。 AuthorityCheckBox 绑定到您的可视复选框。当您单击复选框时,没有任何返回到 AuthorityCheckBox 的链接。

您可以做的是滥用复选框的Tag 属性并将AuthorityCheckBox 引用放在那里。

调整您的AuthorityCheckBox 类,使其包含在构造函数中分配的public Account Parent。这样就可以轻松获取AuthorityCheckBox 父级:

public class AuthorityCheckBox
{
    public string Content { get; set; }
    public bool IsChecked { get; set; }
    public bool IsEnabled { get; set; }
    public Account Parent { get; private set; }

    public AuthorirtyCheckBox(Account parent)
    {
         this.Parent = parent;
    }
}

事件处理程序如下所示:

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    AuthorityCheckBox acb = (sender as FrameworkElement).Tag as AuthorityCheckBox;
    Account parent = acb.Parent;           
}

【讨论】:

  • 迈克,感谢您回复我。我调整了我的 AuthorityCheckBox 类和 CheckBox_Click,但是(作为 FrameworkElement 的发送者)。标签为空,:(
  • 另一个,我用这个。"CheckBox checkBox = sender as CheckBox;", "AuthorityCheckBox acb = checkBox.DataContext as AuthorityCheckBox;", "Account account = acb.Parent;",成功了! !谢谢你给我灵感!
  • @RickyChen,很高兴你能让它为你工作。通常Tag 属性是空的,除非你给它赋值。对你来说它是空的,因为你没有填写它。
  • 好的,感谢您的帮助,并找到解决此问题的解决方案。非常好!
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2013-05-23
  • 2020-04-03
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2021-09-05
相关资源
最近更新 更多