windows phone 8 longlistselector显示和隐藏基于recordid的按钮

时间:2013-10-10 14:03:57

标签: windows-phone-7 windows-phone-8 windows-phone windows-phone-7.1

我的长列表选择器中显示的书籍列表如此

   <DataTemplate x:Key="BooksItemTemplate">         
            <StackPanel Grid.Column="1" Grid.Row="0" VerticalAlignment="Top">
                <TextBlock Name="booktitle" Text="{Binding BookTitle,Mode=OneWay}" Style="{StaticResource PhoneTextNormalStyle}" TextWrapping="Wrap" FontFamily="{StaticResource PhoneFontFamilySemiBold}"/>
                <TextBlock Text="{Binding AuthorName,Mode=OneWay}" Style="{StaticResource PhoneTextNormalStyle}" TextWrapping="Wrap" FontFamily="{StaticResource PhoneFontFamilySemiLight}"/>
                <Button Content="Add To Favourites" Tag="{Binding BookId,Mode=OneWay}" Click="Button_Click_1" ></Button>
            </StackPanel>
        </Grid>
    </DataTemplate>

 <phone:LongListSelector x:Name="bookslist" Grid.Row="1" 
                                 ListFooter="{Binding}"
                                 ItemsSource="{Binding BooksList}"
                                 Background="Transparent"  
                                 IsGroupingEnabled="False"
                                 ListFooterTemplate ="{StaticResource booksListFooter}"                        
                                 ItemTemplate="{StaticResource BooksItemTemplate}"/>

所以列表中的每本书旁边都有一个add to favourites按钮。按下那个按钮,我在像这样的隔离存储设置中输入被按书的ID

private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Button bt = (Button)sender;
        IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
        List<long> ListFavourites; 
        if (settings.Contains("ListFavourites"))
        {
            ListFavourites = settings["ListFavourites"] as List<long>;
        }
        else
        {
            ListFavourites = new List<long>();
        }    

        if(!ListFavourites.Contains(Convert.ToInt64(bt.Tag)))
        {
            ListFavourites.Add(Convert.ToInt64(bt.Tag));
        }
        settings["ListFavourites"] = ListFavourites;
        settings.Save();     
    }     

问题:

现在当页面加载时加载上面的书籍列表(longlistselector)我希望显示或隐藏添加到收藏夹按钮,这取决于bookid是否存在于isolatedstoragesetting中。我在这里尝试的是,我试图将转换器绑定到add to favourite按钮,并将convertparameter绑定到bookid。但转换参数不支持绑定。

那么我可以用什么技术来显示或隐藏添加到收藏夹按钮,这是基于隔离存储设置中收藏夹列表中的图书ID存在?

如何根据bookid单击按钮隐藏按钮?

2 个答案:

答案 0 :(得分:2)

你几乎想到使用转换器。实现时,实际的想法应该是这样的。

首先,您需要实现转换器,在这种情况下,您需要将bookid转换为Visibility值。

public class BookIdToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            //value is booking id here, which means that you just need to check against the isolatedStorageSettings
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            return null;
        }
    }

DataTemplate中,绑定应该是这样的:

<Button Content="Add To Favourites" Tag="{Binding BookId,Mode=OneWay}" 
        Click="Button_Click_1" Visibility={Binding BookId,Converter={StaticResource TheConverterCreatedAbove}} >
</Button>

这应该可以解决问题。

答案 1 :(得分:1)

MVVM的方式是扩展你的ViewModel。将AddToFavoritesCommand添加到BookViewModel而不是将逻辑放在代码中会好得多。如果该按钮绑定到该命令,则当命令正确(使用CanExecuteChanged)将CanExecute切换为false时,它将自动被禁用。

在您的情况下,您可以添加属性IsFavourite或CanAddToFavoirtes然后使用标准的BoolToVisibility转换器(命令执行将设置此属性,并且将使用从IsolatedStorage读取的正确值初始化BookViewModel。)

Book的演示和与Book相关的功能背后的所有逻辑都属于BookViewModel。