使用XAML绑定属性
本文关键字:属性 绑定 XAML 使用 | 更新日期: 2023-09-27 17:54:28
我有userControl
与GridViews
的GridView
(一个GridView
的数据上下文是另一个GridView
),所以当我将itemssource
设置为集合的集合时,我可以看到一个分层视图。
,
父Collection是
List<ClassRoom>
,父Collection是Property
List<Student>
上面的类是定义的,我不能修改类(因为我们认为它是在模型层)使用我的UserControl。
因为我正在开发一个UserControl,所以我定义了一个名为bool ShowChildItems
的属性。
如果ShowChildItems设置为false,我希望childGridView为Collapsed
。
如何将用户控件的属性绑定到childgridview . visibility。(ShowChildItems属性值可能在运行时改变,取决于UserControl的实例)
要在UserControl
中拥有ShowChildItems
属性来管理您的孩子GridView
的Visibility
,您首先需要使其成为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
内部,您将使用ElementName
语法将GridView
Visibility
绑定到此属性-这样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();
}
}
我希望这是你想要的。根据你的问题,我不太确定。
绕过在所有XAML框架中不能修改的模型层项的方法是使用MVVM模式,在这种模式中,您实际上不会绑定到教室列表,而是创建另一种称为ClassroomViewModel的类型,该类型添加了驱动视图所需的属性和方法。
一旦你这样做,你可以添加一个属性到ClassroomViewModel,说StudentListVisibility。然后你的用户控件绑定到的主视图模型将有一个ShowChildItems属性和教室列表属性。用户控件将把它的ShowChildItems依赖属性绑定到视图模型的shochilditems绑定属性,并且视图模型在改变ShowChildItems值时将迭代它的ClassroomViewModel项列表,适当地设置它们的StudentListVisibility。StudentListVisibility当然会被绑定到(子)GridView。可见性财产。
总而言之,从用户体验和工程角度来看,嵌套GridViews听起来都是一个糟糕的设计。也许更好的解决方案是使用SemanticZoom控件,并使用绑定到教室的GridView作为其缩小视图,并使用按教室分组的学生的GridView作为缩小视图。
Visibility
属性不是bool类型。你有没有尝试绑定childGridView。可见性的类型Visibility
的属性?这样的:
private bool _showChildItems;
public Visibility showChildItems
{
get
{
if (_showChildItems)
return System.Windows.Visibility.Visible;
else
return System.Windows.Visibility.Collapsed;
}
}