2013-04-30 80 views
4

我正在创建一个ListView,通过选择它可以从中删除一些项目(这是一个收藏夹列表),调出应用栏并单击“从收藏夹中删除”。点击按钮时,会要求当前视图模型中的某个方法将该项目从列表中删除。发生这种情况后,UI会被更新,并且该项目被删除。后退按钮专注于列表操作

现在,我有两个问题。第一个是当一个项目被移除时,页面的后退按钮接收焦点(它获得虚线轮廓),这是我不想要的。

第二个问题是,该列表不使用添加/删除动画我已经设置它的使用。

对这些任何一个的解决方案将不胜感激。

这里是在一些伪代码会发生什么:

XAML:

<GridView x:Name="FavoritesGridView" 
    Grid.Row="1" 
    SelectionMode="Multiple" 
    ItemTemplate="{StaticResource FavoritesOnSectionViewItemTemplate}" 
    ItemsSource="{Binding FavoritesList}" 
    ItemClick="ProgramGrid_OnItemClick" 
    IsItemClickEnabled="True" 
    SelectionChanged="FavoritesGridView_OnSelectionChanged" 
    ScrollViewer.HorizontalScrollMode="Disabled"> 
    <GridView.ItemContainerStyle> 
     <Style TargetType="Control"> 
     <Setter Property="Margin" Value="0,0,38,8"/> 
     </Style> 
    </GridView.ItemContainerStyle> 
    <GridView.ItemContainerTransitions> 
     <TransitionCollection> 
     <AddDeleteThemeTransition/> 
     </TransitionCollection> 
    </GridView.ItemContainerTransitions> 
    <GridView.ItemsPanel> 
     <ItemsPanelTemplate> 
     <WrapGrid Orientation="Vertical" MaximumRowsOrColumns="9" /> 
     </ItemsPanelTemplate> 
    </GridView.ItemsPanel> 
</GridView> 

代码隐藏:

private void UnFavoriteButton_Click(object sender, RoutedEventArgs e) 
{   
    viewModel.RemoveFromFavorites(FavoritesGridView.SelectedItems.Cast<FavoriteProgram>().AsEnumerable()); 
} 

视图模型:

public void RemoveFromFavorites(IEnumerable<FavoriteProgram> programs) 
{ 
    FavoriteController.RemoveFromFavorites(programs); 
    UpdateUi(); 
} 

private void UpdateUi() 
{ 
    OnPropertyChanged("FavoritesList"); 
} 

public IEnumerable<FavoriteProgram> FavoritesList 
{ 
    get { return CoreData.TvFavorites; } // A centralized list 
} 

FavoritesController:

public static void RemoveFromFavorites(IEnumerable<FavoriteProgram> programs) 
{ 
    if (programs.IsNullOrEmpty()) return; 
    foreach (var program in programs) 
     RemoveFromFavorites(program); 
} 

public static void RemoveFromFavorites(FavoriteProgram program) 
{ 
    if (!IsFavorite(program)) return; 

    var list = CoreData.TvFavorites.ToList(); 
    list.Remove(program); 
    CoreData.TvFavorites = list.AsEnumerable(); 
} 

任何想法?

回答

3

我明白了。所以你有两个问题。

[1]。后退按钮获得焦点。

我认为后退按钮不应该得到焦点。已经有一个关键的手势可以回头了,所以设定焦点是愚蠢的。为什么它还没有被关闭,我不知道。这里是你要做的:

<Button TabIndex="-1" Style="{StaticResource BackButtonStyle}" /> 

或者你可以用一个风格做到这一点:

<Grid Background="Black"> 
    <Grid.Resources> 
     <Style TargetType="Button" BasedOn="{StaticResource BackButtonStyle}" x:Name="MyBackButtonStyle"> 
      <Setter Property="TabIndex" Value="-1" /> 
     </Style> 
    </Grid.Resources> 
    <Button Style="{StaticResource MyBackButtonStyle}" /> 
</Grid> 

使用这种新的风格(或者只是更新现有的一个),将导致后退按钮永远不会获得焦点。如果你希望它能够获得焦点,出于某种原因,那么解决方案将是处理GotFocus事件,并简单地使用(sender as Button).Focus(FocusState.Unfocused);。公平地说,你也应该确定你为什么要消除焦点。

[2]。动画未发生

这是一个常见问题。原因是,你不想在ListView上设置动画,你想在ListViewItemsPanel上设置动画。这是你想要做的:

<ListView> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel> 
       <StackPanel.ChildrenTransitions> 
        <AddDeleteThemeTransition /> 
       </StackPanel.ChildrenTransitions> 
      </StackPanel> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

就这么简单。 (我的示例是StackPanel,请记住在代码中使用WrapGrid)您只是在错误的地方进行了转换。所以,现在您可以处理您遇到的焦点问题,并且您可以获得所需的转换。

我可能会提供一些建议。由于您正在使用视图模型,因此听到您不使用委托命令听起来很奇怪。如果你想最好地使用MVVM,委托命令为你解决了很多问题。在这里阅读:http://blog.jerrynixon.com/2012/08/most-people-are-doing-mvvm-all-wrong.html

并提供第二点建议。这听起来像你可能会使用Visual Studio的默认模板。大多数开发者从那里开始问题是这些模板并不是很适合教授最佳实践。我的建议:不要害怕空白模板。

祝你好运!

2

现在,我有两个问题。第一个是当 页面的后退按钮接收到焦点(它获得虚线轮廓),当一个项目被删除时,我不想要的东西。

这个问题可以通过向GridView的SelectedItem属性添加一个TwoWay-Binding来解决。删除最喜欢的程序后,为每个代码设置SelectedItem,以便它聚焦在GridView中。

XAML:

<GridView x:Name="FavoritesGridView" 
      SelectedItem="{Biding SelectedFavorite, Mode=TwoWay}" /> 

C#:

private FavoriteProgram _selectedFavorite; 

public FavoriteProgram SelectedFavorite { 
    get { 
    return _selectedFavorite; 
    } 
    set { 
    _selectedFavorite = value; 
    OnPropertyChanged("SelectedFavorite"); 
    } 
} 

删除您的物品后,您FavoritesList属性SelectedFavorite设置的项目。

public void RemoveFromFavorites(IEnumerable<FavoriteProgram> programs) { 
    FavoriteController.RemoveFromFavorites(programs); 

    UpdateUi(); 

    SelectedItem = FavoritesList.FirstOrDefault(); // selects the first element in list. 
} 

的第二个问题是,名单不使用添加/删除 动画,我将它设置为使用。

这里的问题是,你总是用一个新的集合/列表,你的财产CoreData.TvFavorites您已经删除您的收藏夹之后,因此可以在GridView不能确定哪些项目已被删除或添加。

对于绑定场景,有一个名为ObservableCollection<T>的专用集合,它实现了接口INotifyCollectionChanged。该接口定义一个事件来通知(UI元素)项目被添加或从集合中删除。您应该更改您的属性FavoritesList以键入ObservableCollection<FavoriteProgramm>并更新UpdateUI方法中的集合以删除相关的收藏夹。

private void UpdateUi() 
{ 
    //Update your FavoritesList to enable animations. 
    OnPropertyChanged("FavoritesList"); 
} 

private ObservableCollection<FavoriteProgram> _favorites; 
public ObservableCollection<FavoriteProgram> FavoritesList 
{ 
    get { 
    if (_favorites == null) { 
     _favorites = new ObservableCollection<FavoriteProgram>(); 
    } 

    return _favorites; 
    } 
}