【问题标题】:Need insight about how n when bindings are evaluated需要了解如何评估绑定时的 n
【发布时间】:2026-01-01 21:40:01
【问题描述】:

我有一个从现有 WPF 组合框派生的自定义组合框控件。这个自定义组合有一个名为 AssociatedEnum 的 DP,一旦设置它就会评估枚举成员并将它们添加到 Items 集合中。 然而,所有这些对可用值的枚举都是在 Combo 的加载事件中完成的 假设在控件加载事件期间将设置并评估 Dependency props 上的所有绑定是否合理。

我对此不太确定,因为我已经看到了一些在加载事件后评估绑定的情况,这违背了在加载事件中编写选择的全部目的。 我的问题是我应该继续为这个依赖属性实现属性更改处理程序吗??

问候, v703218

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我的问题是我应该继续为这个依赖属性实现属性更改处理程序吗??

    无论如何你都应该这样做。这是评估选择的一种更安全的方法,因为没有它,您将无法支持从代码调用的更改集合。

    通过在这里处理它,您可以保证捕获绑定,无论它在哪里或如何设置。

    【讨论】:

      【解决方案2】:

      Loaded 事件继承自 FrameworkElement,因此与 UI 直接相关。你这样做的方式似乎有点奇怪,但这可能是因为我误解了细节。

      如果您只是希望 ComboBox 为用户预填充数据,这可以通过简单地绑定到标准 ObservableCollection<T> 然后设置 ComboBox Style/Template 来满足您的演示需求,更具体地说是 @ 987654327@ 如下图...

              <ComboBox.ItemTemplate> 
                  <DataTemplate> 
                      <Border>  
                          <StackPanel Orientation="Horizontal"> 
                              <TextBlock Text="{Binding Foo}" /> 
                              <TextBlock Text="{Binding Bar}" /> 
                          </StackPanel> 
                      </Border> 
                  </DataTemplate> 
              </ComboBox.ItemTemplate> 
      

      以上将使用绑定对象上的多个项目,但是您也可以使用DisplayMemberPath 我认为您可能做的比创建自定义ComboBox 需要的更多。

      【讨论】:

        【解决方案3】:

        谢谢里德... 这就是我们一直在争论的问题,在大多数情况下,我和我的同事已经看到所有绑定都被解析并设置为初始值(不是 Load it self 之前的默认值或后备值......但是我遇到了这种情况在我的控件加载后正在评估绑定,因此错过了应该在 LOAD 事件中完成的所有操作..

        让所有标准控件(MS WPF 控件)正确绑定,但我的自定义控件错过了它,因为一切都只在加载期间完成...

        你有什么文章可以启发我们吗?

        【讨论】:

          【解决方案4】:

          我同意你的推理,但是我想知道 Microsoft/WPF 创建者是否保证在加载控件之前绑定将被评估为其第一个值...

          例如我有一个组合框

          我有代码

          公共 CustomCombo()

          {

          this.Loaded += OnLoaded; }

          private void OnLoaded(Object sender,RoutedEventArgs e)

          {

          if(CustomDP != null){

          //填充组合内的项目

          } }

          在这种情况下,如果我的绑定在加载我的组合之前没有被评估,它将保持为空.. 不是吗?

          我们有些人认为这种情况永远不会出现,我的问题是是否真的如此,或者绑定也可以在加载后进行评估,因为它可能取决于 Datacontext 或视觉/逻辑树中的位置

          【讨论】: