如何从自定义控件的子项绑定到页面

时间:2013-06-07 15:57:17

标签: silverlight binding

我有以下自定义Silverlight面包屑控件:

    <custom:BreadcrumbList Navigator="{Binding ModuleNavigator}">
        <custom:BreadcrumbList.Items>
            <custom:BreadcrumbItem ViewName="Home"/>
            <custom:BreadcrumbItem ViewName="Items"/>
            <custom:BreadcrumbItem Command="{Binding ReturnCommand}"/>
            <custom:BreadcrumbItem ViewName="ItemConstraints"/>
        </custom:BreadcrumbList.Items>
    </custom:BreadcrumbList>

我真的希望Command的{​​{1}}属性绑定到 页面的数据上下文而不是父控件。我知道如何在BreadcrumbItem绑定参数的其他XAML环境中执行此操作,但这不起作用。我怎么能在Silverlight中这样做?

感谢。

2 个答案:

答案 0 :(得分:0)

我确实找到了解决方案,我还在等待更好的解决方案。 BreadcrumbItem子类直接DependencyObject。我添加了以下属性:

    private Object _parentContext = null;

    public Object ParentContext
    {
        get { return _parentContext; }
        set { _parentContext = value; RaisePropertyChanged("ParentContext"); }
    }

然后在Loaded(父控件)的BreadcrumbList事件中,我将所有项ParentContext属性设置为其数据上下文。

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        Loaded -= OnLoaded;

        foreach (var item in Items.OfType<BreadcrumbItem>())
            item.ParentContext = DataContext;
    }

然后我将我的XAML改为:

<custom:BreadcrumbList Navigator="{Binding ModuleNavigator}">
    <custom:BreadcrumbList.Items>
        <custom:BreadcrumbItem ViewName="Home"/>
        <custom:BreadcrumbItem ViewName="Items"/>
        <custom:BreadcrumbItem Command="{Binding ParentContext.ReturnCommand}"/>
        <custom:BreadcrumbItem ViewName="ItemConstraints"/>
    </custom:BreadcrumbList.Items>
</custom:BreadcrumbList>

这样可行,但我仍在寻找更好的选择。

答案 1 :(得分:0)

根据您的datacontext的级别,有几种方法。如果您绑定到数据网格中的元素本身,那么您可以使用与父控件类型的祖先类型的相对源绑定。 如果您有一个具有所需数据的特定元素,则可以使用该元素名称和数据路径进行绑定。 如果您在xaml中声明了视图模型,则可以绑定到静态资源,并使用视图模型的名称和数据项的路径。