/// <summary> /// 把view的行为适配到control上。 /// 同时也把control的行为适配到view上。 /// /// LogicalView.IsVisible 和 TabItem.Visibility 的关系: /// 在目标上,两者实现双向绑定。 /// 1. LogicalView.IsVisible 的改变,直接通过 IsVisibleChanged 事件的处理函数来设置对应的 TabItem 的 Visibility 属性。 /// 2. TabItem.Visibility 先使用 OnWay 的 Binding 来直接绑定在实体类父对象的某个属性上,实现动态可见性。 /// 然后,在 Binding 的 UpdateTarget 事件处理函数中,再设置 LogicalView.IsVisible 的值。 /// 代码位于 ListLogicalView.ResetVisibility() 方法中。 /// </summary> /// <param name="childView"></param> /// <param name="control"></param> public static void AdaptView(LogicalView childView, TabItem control) { //IsActive control.IsSelected = childView.IsActive; childView.IsActiveChanged += (o, e) => { control.IsSelected = childView.IsActive; }; //IsVisible control.Visibility = childView.IsVisible ? Visibility.Visible : Visibility.Collapsed; childView.IsVisibleChanged += (o, e) => { var tabControl = control.GetLogicalParent <TabControl>(); Debug.Assert(tabControl != null, "tabControl != null"); if (childView.IsVisible) { control.Visibility = Visibility.Visible; tabControl.Visibility = Visibility.Visible; } else { control.Visibility = Visibility.Collapsed; if (tabControl.Items.OfType <TabItem>().All(i => i.Visibility == Visibility.Collapsed)) { tabControl.Visibility = Visibility.Collapsed; } } }; }