尝试为列表视图wpf分隔列中的2个项目

时间:2015-06-10 19:53:56

标签: mysql wpf listview asterisk

我是wpf的新手...任何帮助将不胜感激。 我开始了一个带有listview的小项目,它显示了MySQL的内容。到目前为止,除了包含2个项目的列之外,我没有任何问题。我需要将每个项目分开到自己的列中。 日期和时间很容易,但这个超出了我的技能。

列表视图的显示就像那样(我还不能发布图像):

日期|时间|来电者ID |来自|收件人|持续时间

2015年6月10日| 22:45 |" alex" < 210555555> | 101 | 201 | 234

CallerID列包含两个不同的值""和<>。我需要像对待DateTime那样分开。谢谢你的帮助。

  <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();
                }

            }
        }

3 个答案:

答案 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 ()

enter image description here