1

我正在编写一个聊天程序,并且我有一个页面,用户可以在其中选择保存的聊天历史。它们都在具有 2 列的 ListView 中:日期和合作伙伴。为了有 2 列,我通过编写自己的条目类(在 WPF ListView 中将项目添加到列)找到了解决方案。这是我的 MessageHistoryEntry:

public class MessageHistoryEntry : ListViewItem
{
    public int EpochTime { get { return int.Parse(this.Content.ToString().Split("|")[0]); } }
    public string[] Usernames { get { return this.Content.ToString().Split("|").Skip(1).ToArray(); } }
    public string Partner { get { return this.Content.ToString().Split("|").Skip(1).ToArray()[0]; } }

    public string Entrystring { get { return this.Content.ToString(); } set { this.Content = value; } }
    public string TimeString { get {                    
    DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(int.Parse(this.Content.ToString().Split("|")[0]));
    return dateTimeOffset.ToString(); } }
}

entrystring 是一个特殊格式的字符串:<timeinepoch>"|"<partner>("|"<othermembers>)+,例如1619819688|ExampleUser1|ExampleUser2

所以我有一个包含 2 列的 ListView,如果用户单击一个项目(我在这里找到了如何添加 clickevent:WPF ListView - 检测何时单击所选项目),它会加载相应的聊天对话。

列表视图:

<ListView Margin="0,0,1027,112" x:Name="ChatHistoryListView" >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Date" DisplayMemberBinding="{Binding TimeString}"/>
            <GridViewColumn Header="Partner" DisplayMemberBinding="{Binding Partner}"/>
        </GridView>
    </ListView.View>


    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="SelectSaveHistory" />
        </Style>
    </ListView.ItemContainerStyle>


</ListView>

我的问题是,每当我尝试填写列表时,都会出现以下错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'TimeString' property not found on 'object' ''String' (HashCode=808077091)'. BindingExpression:Path=TimeString; DataItem='String' (HashCode=808077091); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'Partner' property not found on 'object' ''String' (HashCode=808077091)'. BindingExpression:Path=Partner; DataItem='String' (HashCode=808077091); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

但是当我点击它时,它给了我正确的信息,并且正确地加载了聊天记录,所以内容是正确的,只是显示有问题。

所以我的问题是,如何在我的 ListView 列中显示这些数据成员?


我填充 ListView 的方式:

private void BeginHistory(object sender, RoutedEventArgs e)
{           
    string[] histories = misc.GetUserHistoryIDs(curUser.Username); ///getting the chathistory id elements from a controller

    foreach(string history in histories)
    {
        MessageHistoryEntry entry = new MessageHistoryEntry();

        entry.Entrystring = history; ///setting the entrystring, which is equivalent to the content now

        ChatHistoryListView.Items.Add(entry); ///adding the entry to the list
    }

}
4

1 回答 1

1

不要从 ListViewItem 继承 MessageHistoryEntry。ListView 将为您的数据项创建 ListViewItems。Items集合可以包含任何类型的对象,甚至可以同时包含不同类型的对象

也不要进行多次拆分:

public class MessageHistoryEntry
{
    public int EpochTime { get; private set; }
    public string TimeString { get; private set; }
    public string[] Usernames { get; private set; }
    public string Partner { get; private set; }

    string  entrystring;
    public string Entrystring 
    { 
         get { return entrystring; } 
         set 
         { 
             entrystring = value; 

             var parts = entrystring.Split("|"); 
             EpochTime = int.Parse(parts[0]); 
             TimeString = DateTimeOffset.FromUnixTimeSeconds(EpochTime).ToString();
             Usernames = parts.Skip(1).ToArray();
             Partner = Usernames[0];             
         } 
     }
}
于 2021-05-01T17:14:01.587 回答