【发布时间】:2016-07-08 22:37:43
【问题描述】:
我正在创建一个带有显示消息对象的列表视图的消息传递应用程序。
当新用户加入时,我想添加(例如)“约翰加入”,但我希望它的格式不同于消息。
我怎样才能做到这一点?
【问题讨论】:
我正在创建一个带有显示消息对象的列表视图的消息传递应用程序。
当新用户加入时,我想添加(例如)“约翰加入”,但我希望它的格式不同于消息。
我怎样才能做到这一点?
【问题讨论】:
对于这种场景,可以实现ListView的ItemsControl.ItemTemplateSelector property。
例如,首先创建一个继承自DataTemplateSelector 的类,如下所示:
public class MessageDataTemplateSelecotr : DataTemplateSelector
{
public DataTemplate NormalTemplate { get; set; }
public DataTemplate JoinedTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var message = item as MessageModel;
if (message.MessageType.ToString() == "Normal")
return NormalTemplate;
else
return JoinedTemplate;
}
}
然后你可以像这样使用这个选择器:
<Page.Resources>
<DataTemplate x:Key="NormalMessageTemplate">
<TextBlock Text="{Binding Message}" FontSize="20" Foreground="Blue"/>
</DataTemplate>
<DataTemplate x:Key="JoinedMessageTemplate">
<TextBlock Text="{Binding Message}" FontSize="15" Foreground="Red"/>
</DataTemplate>
<local:MessageDataTemplateSelecotr x:Key="MessageDataTemplateSelecotr"
NormalTemplate="{StaticResource NormalMessageTemplate}"
JoinedTemplate="{StaticResource JoinedMessageTemplate}"/>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView ItemTemplateSelector="{StaticResource MessageDataTemplateSelecotr}" ItemsSource="{x:Bind listViewCollection}"/>
</Grid>
在后面的代码中,只需将数据添加到listViewCollection 中,如下所示:
ObservableCollection<MessageModel> listViewCollection = new ObservableCollection<MessageModel>();
private enum _MessageType
{
Normal,
Joined
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
listViewCollection.Add(new MessageModel { Message = "hello world!", MessageType = _MessageType.Normal });
listViewCollection.Add(new MessageModel { Message = "John joined", MessageType = _MessageType.Joined });
}
而我的MessageModel 班级是这样的:
public class MessageModel
{
public string Message { get; set; }
public Enum MessageType { get; set; }
}
【讨论】:
看看这个问题的公认答案ItemsControl with multiple DataTemplates for a viewmodel
您可以将 CompositionCollection 与列表视图中定义的两个数据模板一起使用。一个用于普通消息的数据模板,一个用于连接消息。
【讨论】: