2013-04-30 79 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; 
    } 
}