绑定到子视图中的datacontext

时间:2013-11-26 09:07:05

标签: wpf datatemplate

我有一个tabcontrol的datatemplate,我绑定到一个视图列表。 我希望用BusyIndi​​cator包装每个视图,并将BusyIndi​​cator的IsBusy属性绑定到视图IsBusy属性。 这是模板:

 <TabControl ItemsSource="{Binding ViewModels}"  x:Name="TabControlViews">
    <TabControl.ItemTemplate>
        <!-- this is the header template-->
        <DataTemplate>
            <TextBlock
                    Text="{Binding Title}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <!-- this is the body of the TabItem template-->
        <DataTemplate>
            <xctk:BusyIndicator IsBusy="{Binding DataContext.IsBusy, RelativeSource={RelativeSource FindAncestor,AncestorType=ContentControl}}">
                <xctk:BusyIndicator.BusyContent>
                    <TextBlock Text="Vent venligst ..." VerticalAlignment="Center" />
                </xctk:BusyIndicator.BusyContent>
                <ContentControl Content="{Binding View}"/>
            </xctk:BusyIndicator>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

这是每个标签的视图模型

public class TabViewModel : INotifyPropertyChanged
{
    private ContentControl _view;
    public string Title { get; set; }

    public ContentControl View
    {
        get { return _view; }
        set { _view = value; OnPropertyChanged();}
    }

    public ViewType ViewTypeToLoadType { get; set; }
    public bool IsLoaded { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

所以我要绑定的属性的路径是正确的: ContentControl.DataContext.View.DataContext.Isbusy

有可能吗?

2 个答案:

答案 0 :(得分:0)

你为什么这样做?这是WPF ...我们使用数据,而不是 UI控件。只需将您的IsBusy属性添加到它所属的视图模型中。视图模型唯一的工作是提供视图中所需的所有数据。如果您的要求是在忙时显示忙碌指示符,则视图模型中需要该属性。

就像任何其他数据一样......你需要展示一个人吗?..把它放在视图模型中......你需要显示一个地址吗?..把它放在视图模型中......你需要显示一个繁忙的指示器吗?..把它放在视图模型中。

此外,如果您将IsBusy属性放在视图模型中,那么您将不需要询问如何将其绑定到UI,因为它就像绑定任何其他属性和您的{一样简单} {1}}控件只是视图的一部分:

BusyIndicator

更新&gt;&gt;&gt;

好的,那么要回答你的实际问题......你希望能够绑定到这条路径:<xctk:BusyIndicator IsBusy="{Binding IsBusy}" />

据我所知,你无法从ContentControl.DataContext.View.DataContext.Isbusy绑定视图到另一个DataContext ......我不确定我是否理解这一点。但是,您可以做的是使用DataContext来访问视图...尝试这样的事情:

RelativeSource Binding

唯一的问题是{Binding DataContext.IsBusy, RelativeSource={RelativeSource AncestorType={x:Type YourXmlNamespacePrefix:YourView}}} 中指定的视图必须是定义Binding的视图的父级或祖先。

答案 1 :(得分:0)

这是有效的,因为datatemplate的datacontext是一个TabViewModel。所以我们需要绑定到View属性的datacontext以获取IsBusy属性

<xctk:BusyIndicator IsBusy="{Binding View.DataContext.IsBusy}">