在模型集合中获取模型的价值

时间:2018-10-23 12:23:27

标签: c# .net wpf mvvm

我有一个集合ConversationModel,其中有两个模型。我想获取集合中第一项的价值。我尝试使用此代码var obj = ConversationCollection.First();来获取值,但始终返回null。在Autos screenshot处,模型的属性已填充但在其外部。我如何获得这些值

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;

我的ItemsControl的WPF代码

            <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>

1 个答案:

答案 0 :(得分:1)

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

如果将其类型更改为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
}