ListView 中包含的 UserControl 中的绑定问题
Binding issue in UserControl contained in a ListView
我的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();
其中 groups
是一个 Linq
查询,它按对象 属性
对对象进行分组
一切正常,可以在 ListView 中成功显示我的组对象。我遇到问题的地方是各个列表项的布局。该模板如下所示,包括在另一个文件中定义的用户控件。
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 的值,它工作正常。
您是否尝试过在用户控件上设置名称 (x:Name="userControl") 并将绑定更改为 Text="{Binding Path=Alert, ElementName=userControl}"?
我的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();
其中 groups
是一个 Linq
查询,它按对象 属性
一切正常,可以在 ListView 中成功显示我的组对象。我遇到问题的地方是各个列表项的布局。该模板如下所示,包括在另一个文件中定义的用户控件。
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 的值,它工作正常。
您是否尝试过在用户控件上设置名称 (x:Name="userControl") 并将绑定更改为 Text="{Binding Path=Alert, ElementName=userControl}"?