我的长列表选择器中显示的书籍列表如此
<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单击按钮隐藏按钮?
答案 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。