【问题标题】:Display values in ListView using ObjectDataProvider使用 ObjectDataProvider 在 ListView 中显示值
【发布时间】:2016-09-23 01:31:53
【问题描述】:

大家好,我想知道为什么我的ListView 加载为空白。

我创建了一个ObjectDataProvider,它从我的控制器加载Articulos 列表中的DataTable

TrabajarArticulos.cs

namespace ClasesBase
{
    public class TrabajarArticulos
    {
        public static DataTable TraerArticulos()
        {
            SqlConnection cnn = new SqlConnection(ClasesBase.Properties.Settings.Default.conexion);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "SELECT * FROM Articulo";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = cnn;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);           
            return dt;
        }
    }
}

Articulos.xaml

<Window.Resources>
    <ObjectDataProvider x:Key="lista_articulos" ObjectType="{x:Type svc:TrabajarArticulos}" MethodName="TraerArticulos"></ObjectDataProvider>
</Window.Resources>

这用于ListView中的相同窗口

<ListView Name="ListArt" 
              ItemsSource="{Binding Source={StaticResource ResourceKey=lista_articulos}}"
              Margin="360,61,22,184">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Id" Width="50" DisplayMemberBinding="{Binding Path=Art_Id}"></GridViewColumn>
                    <GridViewColumn Header="Descripcion" Width="100" DisplayMemberBinding="{Binding Path=Art_Descrip}"></GridViewColumn>
                </GridView.Columns>                    
            </GridView>
        </ListView.View>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

但是当它加载时它是空白的(不是空的)Example

我的第一个想法是它无法加载,但使用PreviewMouseLeftButtonDown 进行调试我可以看到我的数组的值。

还尝试使用DataContext 代替ItemsSource,但仍然没有结果。

甚至认为我在GridViewColumn 上绑定错误,但仍然没有运气。

知道我做错了什么吗?

编辑我注意到,如果我手动添加我的对象Articulo,它显示得很好。现在让我更加迷失在哪里出了问题。

ListArt.Items.Add(articulo);

解决方案

感谢 jstreet 的反馈,我发现了非常基本的问题。

DataTable 中的所有 ColumnName 都是小写字母,而不是大写字母作为我的模型。

所以GridViewColumn 应该是这样的:

<GridViewColumn Header="Id" Width="50" DisplayMemberBinding="{Binding Path=art_id}"></GridViewColumn>
<GridViewColumn Header="Descripcion" Width="100" DisplayMemberBinding="{Binding Path=art_descrip}"></GridViewColumn>

【问题讨论】:

  • 通过&lt;DataGrid ItemsSource="{Binding Source={StaticResource ResourceKey=lista_articulos}}"/&gt;查看。
  • 我试过了,仍然显示为空
  • 从您的方法中返回 System.Data.DataView 并使用 return dt.DefaultView ;然后将其与DataGrid 一起使用。

标签: .net wpf xaml listview


【解决方案1】:

这真的取决于你的TrabajarArticulos 实现。这是一些工作示例代码:

XAML:

<Window x:Class="WpfApplication286.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication286"
    mc:Ignorable="d"
    Title="MainWindow" Height="300" Width="300">
<Window.Resources>

    <ObjectDataProvider x:Key="Source1" 
                        ObjectType="{x:Type local:MyDataTable}">
    </ObjectDataProvider>

</Window.Resources>

<Grid>

    <ListView ItemsSource="{Binding Source={StaticResource ResourceKey=Source1}}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Path=ID}"></GridViewColumn>
                    <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Path=Description}"></GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

</Grid>

数据表:

public class MyDataTable : DataTable
{
    public MyDataTable()
    {
        Columns.Add("ID", typeof(int));
        Columns.Add("Description", typeof(string));

        for (int i = 1001; i <= 1005; i++)
        {
            DataRow row = NewRow();
            row["ID"] = i;
            row["Description"] = string.Format("Data item from table {0}", i);
            Rows.Add(row);
        }
    }
}

编辑:请注意ObjectDataProviderResource。如果您要在运行时动态填充它...,也许您最好还是坚持使用标准的MVVM 方法。尽管如此,出于我们这里的测试目的,从我的本地数据库中检索数据的方式仍然相同:

XAML:

<ObjectDataProvider x:Key="Source1" 
                        ObjectType="{x:Type local:MyDataTable}"
                        MethodName="GetDbData">
</ObjectDataProvider>

数据表:

public DataTable GetDbData()
    {
        SqlConnection cnn = new SqlConnection(con);
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM Production.Product";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = cnn;
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        foreach (DataRow dr in dt.Rows)
        {
            DataRow row = NewRow();
            row["ID"] = dr["ProductID"];
            row["Description"] = dr["Name"];
            Rows.Add(row);
        }

        return this;
    }

【讨论】:

  • 我的数据表,来自数据库,我会更新我的帖子以使其清楚
  • 请看我的编辑
  • 抱歉这个愚蠢的问题,但 NewRow() 是什么?我假设那是new Row(),但找不到导入它的参考。
  • NewRow()DataTable 中的一个方法。看Here - MSDN
  • 哦,谢谢,我刚刚读到了,当我创建Rows.add(row) 时,它被应用在dt 中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多