0

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

例如:

父集合是List<ClassRoom>并且父集合有一个Property List<Student>

上述类已定义,我无法修改类(因为我们认为它在模型层中)以使用我的 UserControl。

因为我正在开发一个 UserControl,所以我定义了一个名为bool ShowChildItems.

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

如何将用户控件的属性绑定到 childGridView.Visisbility。(ShowChildItems 属性值可能会在运行时发生变化,具体取决于 UserControl 的实例)

4

3 回答 3

2

无法在所有 XAML 框架中修改的模型层项目的解决方法是使用 MVVM 模式,您实际上不会绑定到 ClassRoom 列表,而是创建另一种名为 ClassroomViewModel 的类型,它添加了驱动您需要的属性和方法看法。

完成此操作后,您可以向 ClassroomViewModel 添加一个名为 StudentListVisibility 的属性。然后,您的用户控件绑定到的主视图模型将具有 ShowChildItems 属性和 Classrooms 列表属性。用户控件会将其 ShowChildItems 依赖属性绑定到视图模型的 ShocChildItems 可绑定属性,并且在更改 ShowChildItems 值时视图模型将迭代其 ClassroomViewModel 项目列表,并适当地设置它们的 StudentListVisibility。StudentListVisibility 当然会绑定到(子)GridView.Visibility 属性。

所有这一切——从用户体验和工程的角度来看,嵌套 GridViews 听起来都是一个糟糕的设计。也许更好的解决方案是使用 SemanticZoom 控件并使用绑定到 Classrooms 的 GridView 来实现其缩小视图,并使用 GridView 以及按教室分组的学生来实现放大视图。

于 2013-01-20T04:55:26.897 回答
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语法将 the 绑定到该属性 - 这样,绑定的内容无关紧要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();
    }
}

我希望这是你所要求的。根据您的问题,我不太确定。

于 2013-01-20T07:47:25.480 回答
0

Visibility属性不是布尔类型。您是否尝试将 childGridView.Visibility 绑定到 type 的属性Visibility?像这样:

private bool _showChildItems;
public Visibility showChildItems
{
    get
    {
        if (_showChildItems)
            return System.Windows.Visibility.Visible;
        else
            return System.Windows.Visibility.Collapsed;
    }
}
于 2013-01-20T04:20:36.197 回答