首页 > 解决方案 > 在模型集合中获取模型的值

问题描述

我有一个ConversationModel包含两个模型的集合。我想获得集合的第一个项目的价值。我试过这段代码var obj = ConversationCollection.First();来获取值,但它总是返回 null。在这里汽车截图,模型的属性被填充但在它之外。我怎样才能得到这些值

public class ConversationModel
{
    public SendMessageModel SMM { get; set; }

    public ReceivedMessageModel RMM { get; set; }
}

以下是我创建收藏的方式:

 ObservableCollection<ConversationModel> cm = new ObservableCollection<ConversationModel>();

        foreach (DataRow convo in dataTable.Rows)
        {
            string _messageID = (string)convo["MessageID"];
            string message = (string)convo["UserMessage"];
            string username = (string)convo["FromUser"];
            DateTime datetime = (DateTime)convo["MessageDateTime"];
            string messageStatus = (string)convo["MessageStatus"];

            string mdt = "";
            if (datetime.Date == DateTime.Now.Date) mdt = datetime.ToString("t");

            if (username == ClientUsername)
            {                   
                SendMessageModel smm = new SendMessageModel
                {
                    MessageIdentifier = _messageID,
                    UserDisplayName = ClientDisplayName,
                    SendMessage = message,
                    MessageTime = mdt,
                    MessageStatus = (Status)Enum.Parse(typeof(Status), messageStatus)
                };
                cm.Add(new ConversationModel { SMModel = smm });
            }
            else
            {
                ReceivedMessageModel rmm = new ReceivedMessageModel
                {
                    MessageIdentifier = _messageID,
                    ClientDisplayName = RecipientDisplayName,
                    MessageTime = mdt,
                    ReceivedMessage = message
                };
                cm.Add(new ConversationModel { RMM = rmm });
            }
        }

        ConversationCollection = cm;

我的 WPF 代码ItemsControl

            <ItemsControl ItemsSource="{Binding ConversationCollection}">
                <ItemsControl.Resources>
                    <DataTemplate DataType="{x:Type Models:ReceivedMessageModel}">
                        <UserControls:RecievedMessageBubble/>
                    </DataTemplate>
                    <DataTemplate DataType="{x:Type Models:SendMessageModel}">
                        <UserControls:SendMessageBubble />
                    </DataTemplate>
                </ItemsControl.Resources>
            </ItemsControl>

标签: c#.netwpfmvvm

解决方案


如果ConversationCollectionObservableCollection<ConversationModel>,它只能包含ConversationModels这就是为什么您的数据模板都不会被应用的原因。

如果将其类型更改为 example ObservableCollection<object>,则可以同时添加ReceivedMessageModelsSendMessageModels

然后,您将能够通过强制转换来检索第一个项目:

var receivedMessageModel = ConversationCollection[0] as ReceivedMessageModel;
if (receivedMessageModel != null)
{
    //the first item is a ReceivedMessageModel
}
else
{
    var sendMessageModel = ConversationCollection[0] as SendMessageModel;
    // the first item is A SendMessageModel
}

推荐阅读