2014-02-24 2 views
0

로컬 데이터베이스 샘플 (http://code.msdn.microsoft.com/wpapps/Local-Database-Sample-57b1614c)을 기반으로 WP C# 응용 프로그램을 구축했습니다.일시적으로 WP8 목록 상자 정렬

기본 페이지에는 xml 데이터베이스의 항목 목록이 표시되며 기본적으로 생성 된 순서대로 항목이 표시됩니다. 적어도 하나의 다른 정렬 순서를 제공 할 수 있기를 원합니다. 역순으로 정렬하거나 "제목"별로 정렬 할 수 있습니다. 불행히도 WP에서는 Listbox.Sort가 지원되지 않습니다.

나는 XML 파일 자체를 정렬하려고 시도하는 것을 포함하여 여기에 여러 가지 답변을 시도했지만, 코딩의 수준을 넘어선 이유 때문에 목록의 순서는 변경되지 않는다. (Templatestorage 참조) 부적절한 구현.

리스트 박스에 대한 코드는 다음

<ListBox x:Name="Templates" SelectionChanged="OnSelectionChanged" Background="Transparent" Style="{StaticResource ListBoxStyle1}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
     <TextBlock Grid.Row="2" Text="{Binding Subject}" Style="{StaticResource PhoneTextLargeStyle}" Margin="12,2" /> 
     <TextBlock Grid.Row="2" Text="{Binding DT}" Style="{StaticResource PhoneTextSmallStyle}" Margin="12,5" /> 
       <Rectangle Height="1" Margin="23,7,50,7" Fill="{StaticResource PhoneAccentBrush}" MinWidth="400" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

ㄴ 번호는 다음

public partial class MainPage 
{ 
    private readonly TemplateStorage storage = new TemplateStorage(); 

    public MainPage() 
    { 

     InitializeComponent(); 

     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 

     Templates.ItemsSource = storage.GetItems(); 
     this.NavigationService.RemoveBackEntry(); 
    } 

    private void PhoneApplicationPage_GotFocus(object sender, RoutedEventArgs e) 
    { 
     Templates.ItemsSource = storage.GetItems();    
    } 
} 

(주석) 분류에서 다양한 시도를 도시 Templatestorage는이다

public class TemplateStorage 
{ 
    private IList<NanoMemoTemplate> templates; 
    private const string Filename = "template-list.xml"; 

    protected IList<NanoMemoTemplate> Templates 
    { 
     get 
     { 
      return templates ?? (templates = LoadTemplates().ToList()); 
     } 
     set 
     { 
      templates = value; 
     } 
    } 


    protected IEnumerable<NanoMemoTemplate> LoadTemplates() 
    { 
     using(var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if(!applicationStorage.FileExists(Filename)) 
       return Enumerable.Empty<NanoMemoTemplate>(); 



      using(var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Open, FileAccess.Read)) 
      { 
       var document = XDocument.Load(speedListFile); 

       return from t in document.Root.Elements("template") 
         select new NanoMemoTemplate 
         { 
          Id = new Guid(t.Attribute("id").Value), 
          Subject = t.Attribute("subject").Value, 
          Body = t.Attribute("body").Value, 
          DT = t.Attribute("dateCreated").Value, 
         }; 
      } 
     } 
    } 

    //public IEnumerable<NanoMemoTemplate> SortTemplates() 
    //{ 

    // using (var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
    // { 
    //  if (!applicationStorage.FileExists(Filename)) 
    //   return Enumerable.Empty<NanoMemoTemplate>(); 

    //  using (var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Open, FileAccess.ReadWrite)) 
    //  { 
    //   var documentSort = XDocument.Load(speedListFile); 
    //   XDocument datatemp = new XDocument(documentSort); 
    //   var subjectSort = from p in datatemp.Descendants("template") 
    //        orderby (string)p.Attribute("subject") 
    //        select p; 
    //   //var subjectSort = datatemp.Elements("template").OrderBy(p => (string)p.Attribute("subject")).ToArray(); 
    //   string cleanDataDump = subjectSort.ToString(); 
    //   MessageBox.Show(cleanDataDump); 
    //   documentSort.Descendants("template").Remove(); 
    //   documentSort.Element("template").Add(subjectSort); 

    //   return Templates; 
    //  } 

    // } 


    //} 

    //public IEnumerable<NanoMemoTemplate> SortItems() 
    //{ 

    // //Sort XML order so order is saved 
    // using (var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
    // { 
    //  if (!applicationStorage.FileExists(Filename)) 
    //   return Enumerable.Empty<NanoMemoTemplate>(); 

    //  using (var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Open, FileAccess.ReadWrite)) 
    //  { 
    //   var documentSort = XDocument.Load(speedListFile); 
    //   IEnumerable<string> codes = from code in documentSort.Elements("template") 
    //          let subs = (string)code.Element("subject") 
    //          orderby subs 
    //          select subs; 

    //   //return Templates as per usual as sorting is done at DB level 
    //   return from t in documentSort.Root.Elements("template") 
    //     select new NanoMemoTemplate 
    //     { 
    //      Id = new Guid(t.Attribute("id").Value), 
    //      Subject = t.Attribute("subject").Value, 
    //      Body = t.Attribute("body").Value, 
    //      DT = t.Attribute("dateCreated").Value, 
    //     }; 


    //  } 
    // } 
    //} 



    public IEnumerable<NanoMemoTemplate> GetItems() 
    { 
     return Templates; 
    } 

    public void Save(NanoMemoTemplate template) 
    { 
     Templates.Add(template); 
    } 

    public void Delete(NanoMemoTemplate template) 
    { 
     Templates.Remove(template); 
    } 

    //public void Sort(NanoMemoTemplate template) 
    //{ 
    // IList<NanoMemoTemplate> list = new List<NanoMemoTemplate>(); 
    // IEnumerable<NanoMemoTemplate> sortedEnum = list.OrderBy(Templates => Templates.Subject); 
    // IList<NanoMemoTemplate> sortedList = sortedEnum.ToList(); 
    //} 

    public void SaveChanges() 
    { 
     using(var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
     using(var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Create, FileAccess.Write)) 
     { 
      var document = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), 
       new XElement("templates", 
        from t in Templates 
        select new XElement("template", 
         new XAttribute("id", t.Id), 
         new XAttribute("subject", t.Subject), 
         new XAttribute("body", t.Body), 
         new XAttribute("dateCreated", t.DT)))); 

      document.Save(speedListFile); 
     } 
    } 
} 

답변

0

코드에 Templates.ItemsSource = storage.GetItems();을 설정하는 대신 ObservableCollection (또는 다른 en 클래스 레벨의 변수로 umerable 유형) :

//StorageTemplates should be a class-level variable 
ObservableCollection<NanoMemoTemplate> StorageTemplates; 

//You can assign the value to StorageTemplates when the page loads 
StorageTemplates = storage.GetItems(); 

그런 다음 XAML에서 목록 상자에 바인딩 ItemsSource="{Binding StorageTemplates}" 데이터를 적용한다. (바인딩에 대한 추가 정보를 원하시면 See this)

<ListBox x:Name="Templates" ItemsSource="{Binding StorageTemplates, UpdateSourceTrigger="PropertyChanged"}" SelectionChanged="OnSelectionChanged" Background="Transparent" Style="{StaticResource ListBoxStyle1}" > 
    <ListBox.ItemTemplate> 
     .... 
    </ListBox.ItemTemplate> 
</ListBox> 

그런 다음 당신은 항목에 대한 정렬 순서를 설정합니다 ObservableCollection의 기본 정렬 방법을 사용할 수 있습니다. 속성 변경 처리기를 구현해야 할 수도 있습니다. 자세한 내용은 this tutorial을 확인하십시오.