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

不设置DataContext时的WPF绑定问题

  •  0
  • Sheridan  · 技术社区  · 14 年前

    我已经成功地创建了许多具有各种功能的UserControls,将每个控件上的DataContext设置为“this”。当我试图将它们拆分为更小的“内部”用户控件时,我总是遇到一些问题,这些控件将更有用。问题是:

    当DataContext设置为“this”时,我可以绑定到代码隐藏中的属性-它们不必是DependencyProperties。当绑定到普通属性时,程序执行会在代码后面输入代码,在代码后面我可以执行诸如切换列表框项或其他在XAML中无法执行的操作。

    但是,当我创建一个宿主在原始控件中的新“内部”用户控件并将这些属性移动到内部控件时,我现在必须将它们升级为DependencyProperties,以便可以从原始控件绑定到它们。当绑定到DependencyProperties时,程序执行永远不会输入代码,对我来说,这就是问题所在。顺便说一下,我不在内部控件中设置DataContext,而是设置根元素的name属性,并在内部控件属性的绑定中使用elementname=usercontrolname语法。

    我知道,我可以向DependencyProperty添加validateValueCallBackHandler,以便在绑定值更改时获得对代码的访问权限,但它必须是静态方法,因此我无法访问任何非静态成员(即我的整个类)。

    例如,我有一个DurationPicker控件,它在列表框中显示时间段对象。时间段对象基本上是时间段对象的可观察集合,时间段具有StartDate、EndDate和Duration属性。我在DurationPicker控件中有一个MinutesPersegment属性,它绑定到了组合框中的值。它工作得很好。我可以更改组合框值,后面的代码将在列表框中使用正确的新值放置正确数量的时间段对象。

    然后我创建了一个包含TimeSegments对象的内部控件和一个列表框来显示它。现在MinutesPersegment属性必须成为DependencyProperty,这样我就可以从外部控件绑定到它,并且程序执行永远不会在后面输入代码,所以现在我无法更改集合中TimeSegmentObjects的数量。

    还有一件事要注意。我可以从外部控件成功绑定到内部控件的DependencyProperties—我可以看到UI中显示的更改。问题仅仅是当某些绑定属性被更新时,我需要程序执行来输入代码。

    正确的方法是什么?非常感谢。

    编辑-在这个例子中,如果我在外部控件中创建时间段对象并将它们绑定到内部控件,那么它仍然可以工作。这是因为外部控制中的微小分裂性是一种普通属性…但是,我希望每个TimeSegments对象在其内部TimeSegmentsRow控件中处理…所以问题是。

    1 回复  |  直到 14 年前
        1
  •  0
  •   alpha-mouse    14 年前

    首先,你不必设置 DataContext this 只允许绑定到自定义控件的属性。如果有人决定为控件设置另一个DataContext,这是个坏主意。您可以使用相对绑定。

    {Binding Path=PathToProperty, 
             RelativeSource={RelativeSource AncestorType=
                             {x:Type namespaceAlias:typeOfYourControl}}}
    

    并在XAML中声明自定义控件的命名空间别名

    xmlns:namespaceAlias="clr-namespace:YourLibraryNamespace;assembly=YourLibraryAssemblyName"
    

    第二个, wpf will not use your property getter and setter to access your dependency properties 这就是为什么除了 GetValue SetValue . 您可以指定 PropertyChangedCallback 当注册属性时,在属性更改时添加一些逻辑。