2009-08-18 200 views
1

WPF XAML,我有一个自定义控件我已经写了这个包裹查找。 以典型的政府风格,他们有一个查找表,用于所有可能的查找。 我的自定义控件会抛出一个弹出式覆盖图,要求他们从列表中的项目中进行选择。 我的问题与从我的调用表单到我的控件属性到我的基础控制虚拟机的数据绑定有关。WPF自定义控件属性没有收到数据绑定

我打电话这样的控制:

<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); } 

    } 

有在输出窗口或事件日志中没有错误,或写在我的鞋的底部。 插入的调试转换器显示整数值被明确分配。 正如评论中提到的那样,虚拟机当然会实现INotifyPropertyChanged,并正确地提升事件。

此外,实际的类型是'用户控制',而不是自定义控制:它涉及到XAML。

为什么不调用我的控件的属性setter?

+0

我应该补充说我在ViewModel上实现了INotifyPropertyChanged,并在设置VM属性时将事件返回。但是,希望这已经很明显,因为我表示DebugConverter正在被击中。 – DarkwingDuck 2009-08-18 07:14:05

回答

15

为什么不调用我的控件的属性setter?

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

因此,您无法在您的CLR属性上设置断点以确定d-prop是否正在更改。相反,请在d-prop的元数据中指定更改处理程序。然后在这个处理程序中设置一个断点。你也可以使用Snoop这样的工具来查看。顺便说一下,这就是为什么你的CLR包装属性永远不应该超过呼叫GetValueSetValue。它只是为了方便而存在的,任何你用这个属性打包的额外逻辑都不能保证执行。

+1

+1即使在这种特殊情况下这不是问题,未来很可能会有人看这个问题。 – 2009-08-18 13:48:58

+3

+1这是问题所在。相反,我迷上了回调。我能够用类似于本文中提供的代码来实现此目的: http://blogs.msdn.com/llobo/archive/2007/03/05/listening-to-dependencyproperty-changes.aspx – DarkwingDuck 2009-08-19 00:39:46

+0

备注:如果传递给DependencyProperty.Register的名称字符串与CLR属性名称不同,则DP系统_will_将调用GetValue和SetValue(否则它将仍然表现为DP)。自定义回调是一个好得多的设计,但是如果你想创建附加的集合属性,这种攻击很有用。 – 2010-06-10 10:24:22