代码之家  ›  专栏  ›  技术社区  ›  DarkwingDuck

WPF自定义控件属性未接收数据绑定

  •  1
  • DarkwingDuck  · 技术社区  · 15 年前

    WPF XAML,我有一个自定义控件,它包装查找。 在典型的政府方式中,他们有一个查找表来查找所有可能的查找。 我的自定义控件将弹出一个覆盖,要求他们从列表中的项目中进行选择。 我的问题专门与从调用窗体到控件属性到底层控件VM的数据绑定有关。

    我这样给控制室打电话:

    <Controls:LookupSelector SelectedLookupValueId="{Binding Path=DataContext.SelectedHarvestMethod, ElementName=SurveyFormWindow, Mode=TwoWay}" />
    

    (其他垃圾邮件已删除) 在这种情况下,需要显式DataContext,因为控件的实际DataContext是其自己的视图模型。SelectedHarvestmethod是窗体ViewModel上的属性。

    它在“新表单”模式下工作,控件负责设置自己的值(控件包括一个按钮,当您单击它时,会弹出一个弹出窗口,然后您可以选择所需的查找数据值)。 如我所说,这很好,它甚至绑定回上面代码中的“selectedharvestmethod”。我可以很好地使用它,并且确信我的ViewModel始终具有分配给该属性的选定ID。

    但现在我正在执行“编辑现有表单”模式,在该模式中,我将从数据库中加载数据,并在视图模型中设置属性。因此,我设置了“selectedHarvestmethod”,代码工作正常(在setter中命中断点),但不会调用“selectedLookupValueID”上的结果setter-该值永远不会通过。

    “SelectedLookupValueID”是控件视图模型上的DP:

    public static readonly DependencyProperty SelectedLookupValueIdProperty =
    
         DependencyProperty.Register("SelectedLookupValueId", typeof(int), typeof(LookupSelector), new UIPropertyMetadata(0));
    
        public int SelectedLookupValueId
        {
    
             get { return (int) GetValue(SelectedLookupValueIdProperty); }
    
             set { SetValue(SelectedLookupValueIdProperty, value); ViewModel.SetPreSelectedLookupValueId(value); }
    
        }
    

    输出窗口或事件日志中或鞋底上没有错误。 插入的调试转换器显示整数值已被定义分配。 正如在注释中提到的,VM当然实现了inotifyPropertyChanged,并且正确地引发了事件。

    另外,实际类型是“用户控件”,而不是自定义控件:它涉及XAML。

    为什么不调用控件的属性设置器?

    1 回复  |  直到 13 年前
        1
  •  15
  •   Tim Cooper    13 年前

    为什么不调用控件的属性设置器?

    我承认我还没读完你的全部问题——太长了;)但是,你确定装订失败了吗?知道wpf优化依赖属性访问,这样就不会调用clr包装器的getter和setter。相反,它调用 DependencyObject.GetValue DependencyObject.SetValue 直接,通过适当的 DependencyProperty 实例。

    因此,不能在clr属性上设置断点来确定是否正在更改d-prop。相反,在d-prop的元数据中指定一个更改处理程序。然后在此处理程序中设置断点。你也可以使用类似snoop的工具来查看这个。

    顺便说一句,这就是为什么您的clr包装器属性不应该做的不仅仅是调用 GetValue SetValue . 它的存在只是为了方便起见,您使用该属性打包的任何额外逻辑都不能保证被执行。