Я использую 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;
}
}
}
}
}
}
}
}
}