2013-11-26 73 views
0

我有一個tabcontrol的數據模式,我綁定到一個視圖列表。 我希望用BusyIndi​​cator包裝每個視圖,並將BusyIndi​​cator的IsBusy屬性綁定到視圖IsBusy屬性。 這是模板:綁定到子視圖中的datacontext

<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 .sbusy

可能嗎?

回答

0

你爲什麼要那樣做?這是WPF ...我們使用數據,而不是UI控件。只需將您的IsBusy屬性添加到它所屬的視圖模型。視圖模型唯一的作業是提供了視圖中所需的全部數據。如果您的要求是在繁忙時顯示繁忙指示符,則視圖模型中需要該屬性。

就像任何其他數據一樣......你需要展示一個人......把它放在視圖模型中......你需要顯示一個地址......把它放在視圖模型中..你需要顯示一個繁忙的指標嗎?把它放在視圖模型中。此外,如果您將IsBusy屬性放入視圖模型中,則不需要詢問如何將其綁定到UI,因爲它將與綁定任何其他屬性一樣簡單,並且您的控件將只是是視圖的一部分:

<xctk:BusyIndicator IsBusy="{Binding IsBusy}" /> 

UPDATE >>>

好了,所以回答你的問題的實際...你希望能夠綁定到該路徑:ContentControl.DataContext.View.DataContext.Isbusy

據我所知,你不能綁定從DataContext到另一個視圖DataContext ......我不確定我甚至不明白這一點。但是,您可以是用什麼RelativeSource Binding到達視圖...嘗試這樣的事:

{Binding DataContext.IsBusy, RelativeSource={RelativeSource AncestorType={x:Type 
YourXmlNamespacePrefix:YourView}}} 

本,唯一的缺點是,在Binding指定的視圖必須是父母或定義Binding的視圖的祖先。

+0

這是在視圖模型,但具有IsBusy屬性視圖模型是生活在裝上TabViewModel.View的看法。 –

+0

我編碼的是我自己的替代棱鏡區域以加載視圖時有更多的控制權。 –

0

這是行得通的,因爲datatemplate的datacontext是一個TabViewModel。所以我們需要綁定到視圖屬性的DataContext才能到IsBusy財產

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