我有userControl
GridView
GridViews
(A GridView
,其数据上下文是另一个GridView
)所以当我设置{{1}时对于集合的集合,我可以看到分层视图。
例如:
父集合为
itemssource
,父集合有List<ClassRoom>
Property
上面的类是定义的,我不能修改我的UserControl的类(我们认为它在模型层中)。
因为我正在开发UserControl,所以我定义了一个名为List<Student>
的属性。
如果ShowChildItems设置为false,我希望childGridView为bool ShowChildItems
。
如何将用户控件的属性绑定到childGridView.Visisbility。 (ShowChildItems属性值可能在运行时更改,具体取决于UserControl的实例)
答案 0 :(得分:2)
在所有XAML框架中无法修改的模型层项目的方法是使用MVVM模式,您实际上不会绑定到ClassRoom列表,而是创建另一个名为ClassroomViewModel的类型,它添加了您需要的属性和方法推动你的观点。
一旦你这样做,你可以向被调用的ClassroomViewModel添加一个属性,比如说StudentListVisibility。然后,用户控件绑定到的主视图模型将具有ShowChildItems属性和Classrooms list属性。用户控件将其ShowChildItems依赖项属性绑定到视图模型的ShocChildItems可绑定属性,并且更改ShowChildItems值的视图模型将迭代其ClassroomViewModel项列表,相应地设置其StudentListVisibility。 StudentListVisibility当然会绑定到(子)GridView.Visibility属性。
所有这一切 - 从用户体验和工程角度来看,嵌套GridView听起来都是一个糟糕的设计。也许更好的解决方案是使用SemanticZoom控件并使用绑定到教室的GridView进行缩小视图,并使用GridView与学生按教室分组放大视图。
答案 1 :(得分:2)
要在ShowChildItems
中设置UserControl
属性来管理孩子的Visibility
GridView
,首先需要将其设为DependencyProperty
:
public static readonly DependencyProperty ShowChildItemsProperty =
DependencyProperty.Register("showChildItems", typeof (bool), typeof (MyUserControl), new PropertyMetadata(true));
public bool ShowChildItems
{
get { return (bool) GetValue(ShowChildItemsProperty); }
set { SetValue(ShowChildItemsProperty, value); }
}
在UserControl
内,您将使用GridView
语法将Visibility
ElementName
绑定到此属性 - 这样GridView
无关紧要} DataContext
必然会:
<GridView Visibility="{Binding ShowChildItems, ElementName=ControlRoot, Converter={StaticResource VisibilityConverter}}" ItemsSource="{Binding ChildItems}">
为此,您需要将名称设置为UserControl
的根节点(我省略了其余属性):
<UserControl
x:Name="ControlRoot">
我还使用转换器将bool
属性绑定到Visibility
:
<UserControl.Resources>
<local:BoolToVisibilityConverter x:Key="VisibilityConverter" />
</UserControl.Resources>
这是它的代码:
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (!(value is bool)) return Visibility.Collapsed;
return (bool) value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
我希望这就是你所要求的。根据你的问题,我不太确定。
答案 2 :(得分:0)
Visibility
属性不是bool类型。您是否尝试将childGridView.Visibility绑定到类型为Visibility
的属性?像这样:
private bool _showChildItems;
public Visibility showChildItems
{
get
{
if (_showChildItems)
return System.Windows.Visibility.Visible;
else
return System.Windows.Visibility.Collapsed;
}
}