我是wpf的新手...任何帮助将不胜感激。 我开始了一个带有listview的小项目,它显示了MySQL的内容。到目前为止,除了包含2个项目的列之外,我没有任何问题。我需要将每个项目分开到自己的列中。 日期和时间很容易,但这个超出了我的技能。
列表视图的显示就像那样(我还不能发布图像):
日期|时间|来电者ID |来自|收件人|持续时间
2015年6月10日| 22:45 |" alex" < 210555555> | 101 | 201 | 234
CallerID
列包含两个不同的值""和<>。我需要像对待Date
和Time
那样分开。谢谢你的帮助。
<ListView x:Name="Datalist" Grid.Column="1" Grid.Row="4"
ItemsSource="{Binding Path=DS}" Background="White" Foreground="Black" FontSize="16" Grid.ColumnSpan="4" FontFamily="Segoe UI" Margin="1,0,8,0">
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Path=calldate,StringFormat={}{0:dd MMMM yyyy}}"/>
<GridViewColumn Header="Time" DisplayMemberBinding="{Binding Path=calldate,StringFormat={}{0:HH:mm:ss}}"/>
<GridViewColumn Header="CallerID" DisplayMemberBinding="{Binding Path=clid}"/>
<GridViewColumn Header="From" DisplayMemberBinding="{Binding Path=src}"/>
<GridViewColumn Header="To" DisplayMemberBinding="{Binding Path=dst}"/>
<GridViewColumn Header="Duration" DisplayMemberBinding="{Binding duration}" />
</GridView>
</ListView.View>
</ListView>
private void OnLoad(object sender, RoutedEventArgs e)
{
string cs = @"server=192.168.1.123;userid=alex;
password=r3s3ll3r;database=asteriskcdrdb";
MySqlConnection conn = null;
MySqlDataReader rdr = null;
try
{
conn = new MySqlConnection(cs);
conn.Open();
string stm = "(SELECT * FROM cdr ORDER BY uniqueid DESC LIMIT 1000)";
mySqlDataAdapter = new MySqlDataAdapter(stm, cs);
mySqlDataAdapter.Fill(DS);
Datalist.ItemsSource = DS.DefaultView;
}
catch (MySqlException ex)
{
MessageBox.Show("Error: {0}", ex.ToString());
}
finally
{
if (rdr != null)
{
rdr.Close();
}
if (conn != null)
{
conn.Close();
}
}
}
答案 0 :(得分:0)
考虑采用更完整的视图模型方法。您可以创建一组视图模型来定义每个条目的表示逻辑,而不是直接将ItemsSource
绑定到DataTable.DefaultView
。例如,您可以定义视图模型类,例如
public class PhoneCallViewModel
{
public Date CallDate { get; set; }
public string CallerId { get; set; }
// .... Expose properties for each column
}
这将为处理当前问题开辟许多选项。例如,我们如何拆分该来电显示字符串?您可以创建另一个视图模型,例如以下
public class CallerIDViewModel
{
public string CallerName { get; set; }
public string CallerNumber { get; set; }
}
然后PhoneCallViewModel
将公开CallerIDViewModel
属性。在OnLoad
方法中,您将创建这些PhoneCallViewModel
个对象的集合(最好是ObservableCollection
)并将ItemsSource
绑定到它。然后,您只需使用两个新列替换ListView
中现有的来电显示列。一个绑定到CallerID.CallerName
,第二个绑定到CallerID.CallerNumber
(假设PhoneCallViewModel
上的属性名为CallerID
)。
我遗漏了拆分原始调用者ID以及实例化集合的详细信息,因为这些是单独的实现问题。
答案 1 :(得分:0)
你总是可以创建一个转换器并通过一个参数传递你的clid,如果你想要这个号码的名字,它会返回正确的名称。
看起来像是:
<GridViewColumn Header="CallerID" DisplayMemberBinding="{Binding Path=clid, Converter={StaticResource GetCallerIdConverter}, ConverterParameter='Name'}"/>
然后是转换器:
public class GetCallerIdConverter : IValueConverter {
public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
string callerId = value.toString();
if (parameter == "Name")
{
//your regex to return what's in the double quotes ""
}
else
{
//your regex to return what's in the < >
}
}
答案 2 :(得分:0)
func (this *MainController) ControllerName ()