我有一个tabcontrol的datatemplate,我绑定到一个视图列表。 我希望用BusyIndicator包装每个视图,并将BusyIndicator的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
有可能吗?
答案 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}">