使用XAML绑定属性

本文关键字:属性 绑定 XAML 使用 | 更新日期: 2023-09-27 17:54:28

我有userControlGridViewsGridView(一个GridView的数据上下文是另一个GridView),所以当我将itemssource设置为集合的集合时,我可以看到一个分层视图。

,

父Collection是List<ClassRoom>,父Collection是Property List<Student>

上面的类是定义的,我不能修改类(因为我们认为它是在模型层)使用我的UserControl。

因为我正在开发一个UserControl,所以我定义了一个名为bool ShowChildItems的属性。

如果ShowChildItems设置为false,我希望childGridView为Collapsed

如何将用户控件的属性绑定到childgridview . visibility。(ShowChildItems属性值可能在运行时改变,取决于UserControl的实例)

使用XAML绑定属性

要在UserControl中拥有ShowChildItems属性来管理您的孩子GridViewVisibility,您首先需要使其成为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;
    }
}