gpt4 book ai didi

c# - WPF 自定义控件属性未接收数据绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 17:16:33 30 4
gpt4 key购买 nike

WPF XAML,我编写了一个包含查找的自定义控件。在典型的政府方式中,他们有一个用于所有可能查找的查找表。我的自定义控件将抛出一个弹出窗口,要求他们从列表中的项目中进行选择。我的问题特别涉及从我的调用表单到我的控制属性再到我的底层控制 VM 的数据绑定(bind)。

我这样调用控件:

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

(其他垃圾邮件已删除)在这种情况下,需要显式 DataContext,因为控件的实际数据上下文是它自己的 View 模型。 SelectedHarvestMethod 是窗体 ViewModel 的一个属性。

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

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

'SelectedLookupValueId' 是控件 View 模型上的一个 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。

为什么我的控件的属性 setter 没有被调用?

最佳答案

Why isn't the property setter for my control being called?

我承认我还没有读完你的整个问题 - 它太长了;)但是,你确定绑定(bind)失败了吗?知道 WPF 优化了依赖属性访问,这样就不会调用 CLR 包装器的 getter 和 setter。相反,它直接调用 DependencyObject.GetValueDependencyObject.SetValue,传入适当的 DependencyProperty 实例。

因此,您无法在 CLR 属性上设置断点来确定是否正在更改 d-prop。相反,在 d-prop 的元数据中指定一个更改处理程序。然后在此处理程序中设置一个断点。您也可以使用 Snoop 等工具来查看。

顺便说一下,这就是为什么您的 CLR 包装器属性绝不能只调用 GetValueSetValue。它的存在只是为了方便,您使用该属性打包的任何额外逻辑都不能保证执行。

关于c# - WPF 自定义控件属性未接收数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292277/

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