ListView中包含的UserControl中的绑定问题

时间:2015-05-25 23:08:49

标签: c# xaml data-binding datacontext win-universal-app

我的应用结构如下:

MainPage.xaml有一个ListView,其ItemSource设置为CollectionViewSource,填充在代码隐藏中:

MainPage.xaml中

<Page.Resources>
    ...
    <CollectionViewSource x:Key="src" IsSourceGrouped="True" />
    ...
</Page.Resources>

<Grid>
    ...
    <ListView
            ItemsSource="{Binding Source={StaticResource src}}" 
            SelectionMode="None"
            ItemTemplate="{StaticResource processTemplate}"
            ItemContainerStyle="{StaticResource ListViewItemStyle}">
        <ListView.GroupStyle>
            <GroupStyle HeaderTemplate="{StaticResource groupTemplate}"/>
        </ListView.GroupStyle>
    </ListView>
    ...
</Grid>

MainPage.xaml.cs中

var cvs = (CollectionViewSource)Resources["src"];
cvs.Source = groups.ToList();

其中groupsLinq查询,它按对象属性对对象进行分组

这一切都能很好地在ListView中成功显示我的组对象。我有问题的地方是单个列表项的布局。模板看起来像这样,并包含在另一个文件中定义的Usercontrol。

MainPage.xaml中

<DataTemplate x:Name="processTemplate">
    <Grid>
    ...
    <TextBlock Text="{Binding Path=Process}" ... />
    <TextBlock Text="{Binding Path=Description}" ... />
    <TextBlock Text="{Binding Path=LastSuccess}" ... />                
    <Button Grid.Column="1" Grid.RowSpan="3" 
           Background="{Binding Path=Status, 
           Converter={StaticResource stbConverter}}" ... />
    <local:MinutesOverlay ... Visibility="{Binding Path=Status, 
           Converter={StaticResource stoConverter}}"
           Overdue="{Binding Path=MinutesWarning}"
           Alert="{Binding Path=MinutesAlert}"/>
        </Grid>
    </DataTemplate>

MinutesOverlay.xaml

<Grid>
    ...
    <TextBlock Text="{Binding Path=Overdue}" />
    <TextBlock Text="{Binding Path=Alert}" />
    ...
</Grid>

MinutesOverlay.xaml.cs

public sealed partial class MinutesOverlay : UserControl
{

    public MinutesOverlay()
    {
        this.InitializeComponent();
    }

    public static readonly DependencyProperty OverdueProperty = DependencyProperty.Register(
        "Overdue", typeof(int), typeof(MinutesOverlay), new PropertyMetadata(0));
    public static readonly DependencyProperty AlertProperty = DependencyProperty.Register(
        "Alert", typeof(int), typeof(MinutesOverlay), new PropertyMetadata(0));

    public int Overdue
    {
        get { return (int)GetValue(OverdueProperty); }
        set { SetValue(OverdueProperty, value); }
    }

    public int Alert
    {
        get { return (int)GetValue(AlertProperty); }
        set { SetValue(AlertProperty, value); }
    }
}

我的绑定不起作用,我无法弄清楚如何让它们工作。目前,MinutesOverlay控件的可见性由绑定控制,只要我没有设置MinutesOverlay的Datacontext就可以工作。如果我通过执行this.Datacontext = this来设置它,那么绑定就没有效果,并且叠加层始终可见(它应该在大多数时间都会折叠)。

如果我在MainPage.xaml中设置了Overdue和Alert没有绑定的值,那么它可以正常工作。

1 个答案:

答案 0 :(得分:2)

您是否尝试在usercontrol上设置名称(x:Name =“userControl”)并将绑定更改为Text =“{Binding Path = Alert,ElementName = userControl}”?