gpt4 book ai didi

WPF CustomControl : OnApplyTemplate called after PropertyChangedCallback

转载 作者:行者123 更新时间:2023-12-04 08:01:02 27 4
gpt4 key购买 nike

我正在创建一个具有PropertyChangedCallback依赖项属性的WPF CustomControl。在该Callback方法中,我尝试使用GetTemplateChild()方法从OnApplyMethod检索的控件的某些部分上设置值。

问题在于(在某些系统上)在OnApplyTemplate之前调用了PropertyChangedCallback,因此控件部分仍然为null。

我当前使用的解决方法是将e.NewValue从PropertyChangedCallback保存到成员变量,然后在OnApplyTemplate()中调用SetValue(dp,_savedValue)。

解决此问题的正确方法是什么?或者我已经在使用最佳解决方案了?

最佳答案

这就是我们的工作-不能解决原则中的问题,但提供了解决它的明确方法。

  • 为DP值更改事件创建一个处理程序,将其设为OnValueChanged()。通常不需要参数,因为您知道哪个DP发生了更改,并且始终可以获取其当前值。
  • 使用构造函数创建一个名为DeferredAction的类/结构,接受System.Action(这将是对OnValueChanged()的引用)。该类将具有Action属性和一个名为Execute()的方法。

  • 这是我使用的:
    class DeferredAction
    {
    private Action action;

    public DeferredAction(Action action)
    {
    this.action = action;
    }

    private Action Action
    {
    get { return this.action; }
    }

    public void Execute()
    {
    this.Action.Invoke();
    }
    }
  • 在您的控件中创建一个列表。该集合将保留DeferredAction的列表,直到可以成功应用它们为止(通常在base.OnApplyTemplate()之后)。一旦应用了操作,就必须清除集合以避免重复处理。
  • 在OnValueChanged中,请检查您的Part是否不为null(它可能不是),如果是,则将DeferredAction(OnValueChanged()的新实例添加到上一步创建的列表中。用途处理程序,可以从您的DP值更改处理程序中直接调用它,如果Parts不为null,或者将其用作可执行的延迟操作。
  • 在您的OnApplyTemplate中,循环遍历您的延迟操作列表(您知道,如果存在,则尚未应用),并为每个调用Execute。清除列表末尾。

  • 干杯

    关于WPF CustomControl : OnApplyTemplate called after PropertyChangedCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298898/

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