2014-04-18 112 views
0

我很新的Windows Phone編程,並且在編輯ListBox中的數據時遇到問題。
我從我的XML文件中加載數據到列表中,並將它們顯示在列表框中。
我的XML中的每個條目都附有一個類型。我想要這樣做,所以我可以通過選中/取消選中某些CheckBox來刪除/添加某些類型的條目。使用複選框過濾ListBox.ItemsSource

,我發現這樣的事情:
How to remove all ListBox items?

但它並不完全適合我的需要,因爲我只想要刪除的列表框項目的一部分,然後可能拿回來,只需再次選中複選框。
另外,我不想手動添加每個條目,因爲我已經將列表框與包含我的XML條目的列表綁定。

我上傳我的XML像這樣:

Activity.cs

namespace ReadXMLfromFile 
{ 
    public class Activity 
    { 
     public string Type { get; private set; } 
     public string Description { get; private set; } 

     public Activity(string type, string description) 
     { 
      Type = type; 
      Description = description; 
     } 

     public static List<Activity> LoadActivities(XDocument doc) 
     { 
     return doc .Root 
        .Elements("Activity") 
        .Select(el => new Activity((string)el.Attribute("Type"), 
              el.Value)) 
        .ToList(); 
     } 

     public static List<Activity> LoadActivities() 
     { 
     using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if (store.FileExists("Activities.xml")) 
      { 
       using (var stream = store.OpenFile("Activities.xml", 
                FileMode.Open)) 
       { 
        return LoadActivities(XDocument.Load(stream)); 
       } 
      } 
     } 
     // No user file... load the default activities 
     return LoadActivities(XDocument.Load("Assets/Activities.xml")); 

     } 
    } 
} 

這是我爲我的網頁代碼:

namespace ActivityManager 
{ 
    public partial class PivotPage1 : PhoneApplicationPage 
    { 
     private List<Activity> activities; 

     public void ActivityDisplay() 
     { 
      activities = Activity.LoadActivities(); 
      listBox1.ItemsSource = activities; 
     } 

     public PivotPage1() 
     { 
      InitializeComponent(); 
      ActivityDisplay(); 
     } 

     private void CookingCheck_Checked(object sender, RoutedEventArgs e) 
     { 
     } 

     private void ArtCheck_Checked(object sender, RoutedEventArgs e) 
     { 
     } 

     private void LanguageCheck_Checked(object sender, RoutedEventArgs e) 
     { 
     } 

     private void ScienceCheck_Checked(object sender, RoutedEventArgs e) 
     { 
     } 

     private void SportCheck_Checked(object sender, RoutedEventArgs e) 
     { 
     } 

和XAML的列表框:

<ListBox Height="347" HorizontalAlignment="Left" Margin="27,243,0,0" 
     Name="listBox1" VerticalAlignment="Top" Width="410" 
     SelectionChanged="listBox1_SelectionChanged" AllowDrop="False" 
     ItemsSource="{Binding activities}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
       <StackPanel Margin="10"> 
        <TextBlock Text="{Binding Activity}"/> 
       </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

另外這裏是我的XML文件

<?xml version="1.0" encoding="utf-8" ?> 
<Activities> 
    <Activity Type="Cooking"> 
     Cook some Mexican food 
    </Activity> 
    <Activity Type="Art"> 
     Draw a picture 
    </Activity> 
    <Activity Type="Language"> 
     Learn 5 words in Polish you didn't know yet 
    </Activity> 
    <Activity Type="Science"> 
     Write a simple program in C 
    </Activity> 
    <Activity Type="Sport"> 
     Go to the gym 
    </Activity> 
    </Activities> 

你能幫我嗎?我相當卡住,可能錯過了一些明顯的東西。先謝謝你。

+0

請把斷點在列表你檢查過的事件和FilterActivity Happend後檢查ItemsSource不是空的,並有對象在它 – csharpwinphonexaml

+0

@verdesrobert原來,在檢查事件源是空的。 FilterActivity發生後,最終會有對象。 – Tajgun92

回答

0

您應該這樣做:
創建一個過濾器列表。
更新的過濾器列表檢查時/取消選中的複選框,並在每個過濾器的更換更新

private List<Activity> activities; 

public void ActivityDisplay() 
{ 
    activities = Activity.LoadActivities(); 
    FilterActivities(); 
} 

public ObservableCollection<string> ActivityFilter = new ObservableCollection<string>(); 

private void FilterActivities() 
{ 
    listbox1.ItemsSource = null; //sometimes it makes the difference; 
    listBox1.ItemsSource = activities.Where(activity => ActivityFilter.Any(filter => filter == activity.Type) || ActivityFilter.Count == 0); 

} 

public PivotPage1() 
{ 
    InitializeComponent(); 
    ActivityFilter.CollectionChanged += ActivityFilter_CollectionChanged; 
    ActivityDisplay(); 
} 

void ActivityFilter_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    FilterActivities(); 
} 

private void CookingCheck_Checked(object sender, RoutedEventArgs e) 
{ 
    ActivityFilter.Add("Cooking"); 
} 

private void CookingCheck_Unchecked(object sender, RoutedEventArgs e) 
{ 
    ActivityFilter.Remove("Cooking"); 
} 

//Repeat the procedure for each checkbox 

我發現在你的ItemTemplate一個問題用這一個

<ListBox.ItemTemplate> 
    <DataTemplate> 
      <StackPanel Margin="10"> 
       <TextBlock Text="{Binding Description}"/> 
      </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

嗨。我試圖使用你的代碼並重復這個過程,但不幸的是它似乎不起作用。這是完整的嗎?還是有一些額外的方式,我必須刷新列表框才能正確顯示?因爲到目前爲止,無論我選中/取消選中,列表框似乎都不受影響。 – Tajgun92

+0

@ Tajgun92檢查我的更新版本請 – csharpwinphonexaml

+0

可悲的是,它沒有解決問題。然而,在再次查看代碼後,我注意到你在例子中從'public void ActivityDisplay'中刪除了'listBox1.ItemsSource = activities;'。當我做同樣的活動列表根本沒有加載。是否有可能是有問題'listBox1.ItemsSource = activities.Where(activity => ActivityFilter.Any(filter => filter == activity.Type)|| ActivityFilter.Count == 0);'? – Tajgun92