2014-04-18 2 views
0

저는 Windows Phone 용 프로그래밍에 익숙하지 않아 ListBox에서 데이터를 편집하는 데 문제가 있습니다.
XML 파일의 데이터를 목록으로로드하여 ListBox에 표시하고 있습니다.
내 XML의 각 항목에는 유형이 첨부되어 있습니다. 특정 CheckBox를 확인/선택 취소하여 특정 유형의 항목을 제거/추가 할 수 있도록 만들고 싶습니다. CheckBox를 사용하여 ListBox.ItemsSource 필터링하기

나는 이런 식으로 뭔가 발견
How to remove all ListBox items?

을하지만 난 단지리스트 박스 항목의 일부를 삭제할 때문에 정확히 내 요구에 맞게, 그리고 아마도 단순히 다시 확인란을 선택하여 그것을 다시 얻을하지 않습니다.
또한 XML 항목이 포함 된 목록으로 이미 목록 상자를 바인딩 한 이후로 수동으로 모든 항목을 추가하고 싶지 않습니다.

나는 그렇게처럼 내 XML을 업로드 :

Activity.cs : 목록 상자에 대한

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> 
다음
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")); 

     } 
    } 
} 

내 내 페이지에 대한 코드입니다

내 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

에 중단 점을 넣어주세요 사용 발견

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 

목록을 업데이트 필터 목록 체크 된 이벤트와 FilterActivity Happend 후에 ItemsSource가 null이 아니고 객체가 있는지 확인하십시오. – csharpwinphonexaml

+0

@verdesrobert 체크 된 이벤트가 발생하면 소스가 비어 있습니다. FilterActivity가 발생하면 마지막으로 객체가 있습니다. – Tajgun92

답변

0

다음과 같이하십시오.
필터 목록을 만드십시오.
업데이트 확인시/확인란 선택을 취소하고, 각 필터 교환에 나는 당신의 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

관련 문제