UWP TabView OneWay x:Bind无法更新

时间:2019-09-15 05:05:00

标签: c# xaml uwp win-universal-app

我有一个TabView的{​​{1}}如下:

ItemTemplate

这是<controls:TabView.ItemTemplate> <DataTemplate x:DataType="data:Playlist"> <local:HeaderedPlaylistControl IsPlaylist="True" Loaded="HeaderedPlaylistControl_Loaded" MusicCollection="{x:Bind Mode=OneWay}" /> </DataTemplate> </controls:TabView.ItemTemplate> 的一部分:

HeaderedPlaylistControl

当我在标签之间切换时,<local:PlaylistControl AllowReorder="False" AlternatingRowColor="True" ItemsSource="{x:Bind MusicCollection.Songs, Mode=OneWay}"> <local:PlaylistControl.Header> <controls:ScrollHeader Mode="Sticky"> <UserControl> <Grid x:Name="PlaylistInfoGrid" Padding="10" Background="{ThemeResource SystemColorHighlightColor}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Image x:Name="PlaylistCover" Grid.RowSpan="3" Width="180" Height="180" Margin="20" Source="Assets/monotone_bg_wide.png" /> <TextBlock x:Name="PlaylistNameTextBlock" Grid.Column="1" Margin="0,5" VerticalAlignment="Center" FontSize="36" Foreground="White" Style="{StaticResource HeaderTextBlockStyle}" Text="{x:Bind MusicCollection.Name, Mode=OneWay}" /> <TextBlock x:Name="PlaylistInfoTextBlock" Grid.Row="1" Grid.Column="1" Margin="0,5" VerticalAlignment="Top" Foreground="White" Text="{x:Bind MusicCollection.Songs, Converter={StaticResource SongCountConverter}, Mode=OneWay}" /> </Grid> </UserControl> </controls:ScrollHeader> </local:PlaylistControl.Header> </local:PlaylistControl> 不会更新其内容。为什么会这样?

是由于HeaderedPlaylistControl属性(其类型为MusicCollection)还是在切换选项卡时没有通知绑定?如果是这样,我应该把通知放在哪里? Playlist的定义为here

HeaderedPlaylistControl为here

1 个答案:

答案 0 :(得分:0)

是的,正如您所怀疑的那样,问题在于MusicCollection属性是一个普通属性,不会通知更改。要使代码正常工作,您需要将MusicCollection属性设为依赖项属性(请参见docs)。这是一种最适合可视控件的数据绑定属性的属性,并且还具有许多其他功能。

public static readonly DependencyProperty MusicCollectionProperty =
    DependencyProperty.Register(
        nameof(MusicCollection), typeof(Playlist),
        typeof(HeaderedPlaylistControl), null
    );

public Playlist MusicCollection
{
    get { return (bool)GetValue(MusicCollectionProperty); }
    set { SetValue(MusicCollectionProperty, value); }
}