2015-12-22 2 views
0

Я использую ListView и устанавливаю ItemsSources в ObservableCollection объектов Message. DataTemplate для ListViewItem содержит настраиваемый элемент управления. Я определил свойство Message в пользовательском элементе управления и привязал свойство Message к этому настраиваемому элементу управления к элементу dataContext ListViewItem. Когда загруженное событие активируется в пользовательском элементе управления, я хочу сравнить набор ReceivedDate в его сообщении с ReceivedDate, установленным в этом элементе ListViewItem. Это не работает последовательно, поскольку свойство Message установлено на некоторые из ListViewItems к моменту запуска события Loaded и не задано на некоторых.WinRT выборочно скрыть дочерний элемент ListViewItem на основе собора ListViewItem

Пример:

<local:ListView x:Name="MyMessagesView" 
           Visibility="Collapsed" 
           ItemsSource="{Binding Messages}" 
           ItemContainerStyle="{StaticResource AppListViewItemStyle}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <dm:MyScreenRow Message="{Binding}"/> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </local:ListView> 

В коде позади моего CustomControl, я обрабатывать Loaded событие. Я хочу сравнить свойство ReceivedTime, установленное в текущем ListViewItem, с его предыдущим родством и показать дочерний элемент в ListViewItem. Является ли загруженное событие не подходящим для этого? Если нет, какие-либо рекомендации относительно того, как с этим справиться?

public MyScreenRow() 
    { 
     this.InitializeComponent(); 
     this.Loaded += MyScreenRow_Loaded; 
    } 

    private static void MyScreenRow_Loaded(object sender, RoutedEventArgs e) 
    { 
     MyScreenRow screenRow = sender as MyScreenRow; 

     if (screenRow.Message == null) 
     { 
      return; 
     } 

     ListViewItemPresenter presenter = (ListViewItemPresenter)VisualTreeHelper.GetParent(screenRow); 

     if (presenter != null) 
     { 
      ListViewItem currentViewItem = (ListViewItem)VisualTreeHelper.GetParent(presenter); 

      if (currentViewItem != null) 
      { 
       ListView listView = (ListView)ItemsControl.ItemsControlFromItemContainer(currentViewItem); 

       if (listView != null) 
       { 
        int indexOfCurrentContainer = listView.IndexFromContainer(currentViewItem); 

        if (indexOfCurrentContainer == 0) 
        { 
         screenRow.GroupHeader.Visibility = Visibility.Visible; 
        } 
        else 
        { 
         // Get the previous container info 
         ListViewItem previousViewItem = (ListViewItem)listView.ContainerFromIndex(indexOfCurrentContainer - 1); 

         if (previousViewItem != null) 
         { 
          MyScreenRow previousScreenRow = (MyScreenRow)previousViewItem.ContentTemplateRoot; 

          if (previousScreenRow != null 
           && previousScreenRow.Message != null 
           && previousScreenRow.Message.ReceivedTimeUtc != null) 
          { 
           if (screenRow.Message != null 
            && screenRow.Message.ReceivedTimeUtc != null) 
           { 
            if (previousScreenRow.Message.ReceivedTimeUtc.Date.CompareTo(screenRow.Message.ReceivedTimeUtc.Date) != 0) 
            { 
             screenRow.GroupHeader.Visibility = Visibility.Visible; 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     }   

}

ответ

0

Да .. как вы догадались делать это в загруженном случае не будет работать becuase загруженного события срабатывают только один раз, когда ListView в первом экземпляр и загружается с некоторыми элементами после этого ISN Уволен.

Я настоятельно рекомендую вам использовать событие LayoutUpdated. Это часть UIElement, поэтому каждый элемент управления в вселенной Windows должен иметь это.

это срабатывает, когда происходит изменение макета .. в случае списков, когда новые элементы будут добавлены или удалены ..

Теперь в какой-то более интересное .. если вы не хотите, чтобы сделать все это ваши элементы управления сразу же вы можете использовать ContainerContentChanging, это позволит вам применять изменения только для элементов.

<ListView LayoutUpdated="ListView_LayoutUpdated" ContainerContentChanging="ListView_ContainerContentChanging"/> 

Быстрый учебник ссылка: http://blogs.msdn.com/b/hanxia/archive/2013/11/04/incremental-update-item-data-for-listviewbased-controls-in-windows-8-1.aspx