使用XAML绑定属性

时间:2013-01-20 03:41:15

标签: c# xaml windows-runtime windows-store-apps

我有userControl GridView GridViews(A GridView,其数据上下文是另一个GridView)所以当我设置{{1}时对于集合的集合,我可以看到分层视图。

例如:

  

父集合为itemssource,父集合有List<ClassRoom> Property

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

因为我正在开发UserControl,所以我定义了一个名为List<Student>的属性。

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

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

3 个答案:

答案 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;
    }
}