[英]C# WPF BindingExpression path error in ListView
我正在编写一个聊天程序,并且我有一个页面,用户可以在其中 select 保存聊天历史。 它们都在具有 2 列的 ListView 中:日期和合作伙伴。 为了有 2 列,我通过编写自己的条目 class ( 将项目添加到 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
}
}
不要从 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];
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.