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 是否存在于隔离存储设置中显示或隐藏添加到收藏夹按钮。我在这里尝试的是,我尝试将转换器绑定到add to favourite按钮,并将转换参数与 bookid 绑定。但转换参数不支持绑定。

那么我可以使用什么技术来根据isolatedstoragesetting中收藏夹列表中的书ID存在来显示或隐藏添加到收藏夹按钮?

如何在基于 bookid 单击它时隐藏基于按钮的按钮?

4

2 回答 2

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>

这应该够了吧。

于 2013-10-10T14:36:24.173 回答
1

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

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

Book 呈现背后的所有逻辑以及与 Book 相关的功能都属于 BookViewModel。

于 2013-10-12T15:57:53.497 回答