【问题标题】:WPF ListView binding to a custom classWPF ListView 绑定到自定义类
【发布时间】:2011-07-27 18:19:56
【问题描述】:

我的问题看起来很简单。但是我尝试实现它的方式有点复杂。我已经实现了一个单例模式,以便使用一些全局数据我有类联系历史记录,我想将它的一些属性绑定到 ListView->GridView->GridViewColumn。我有一个要绑定的列表。我已经阅读了一些教程并尝试实现它们,但我的 XAML 代码似乎存在一些问题,因为当我绑定 listobject 时,它可以解析它的路径。看来我没有包括正确的东西。以下是需要的代码

单例类

     class Singleton
        {
            private static Singleton instance = new Singleton();
            public List<Contacts> ContactList ;

            public SQLiteConnectionStringBuilder builder;
            public SqLiteProvider _db;
            public DataHelper _helper;
            public DataTable DataTable_Contacts;
            public DataTable DataTable_ContactHistory;
            public List<String> Contact_Names;
            public ListBox ListBox_names;
            public int Contact_Index;
            public int ContactHistory_Index;

            private Singleton()
            {
                ContactList = new List<Contacts>();

                builder = new SQLiteConnectionStringBuilder();
                builder.DataSource = Util.GetCurrentDirectory() + "TestDatabases\\DatabaseAccessLayerSqlLite.db";
                _db = new SqLiteProvider();
                _db.ConnectionString = builder.ConnectionString;
                _helper = new DataHelper(_db);
                DataTable_Contacts = new DataTable();
                DataTable_ContactHistory = new DataTable();
                Contact_Names = new List<string>();
            }
       .
       .
}

Xaml 代码

<Window x:Class="NET_Data_Access_Layer_Demo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:themes="clr-namespace:WPF.Themes;assembly=WPF.Themes"
        xmlns="clr-namespace:NET_Data_Access_Layer_Demo.Properties"

        Title="Customer Contact Manager" Height="535" Width="702" Loaded="Window_Loaded" Activated="Window_Activated">
        <GroupBox Header="History" Height="230" HorizontalAlignment="Left" Margin="182,252,0,0" Name="groupBox_history" VerticalAlignment="Top" Width="487">
            <Grid>
                <Button Content="Edit" Height="23" HorizontalAlignment="Left" Margin="164,163,0,0" Name="button_edithistory" VerticalAlignment="Top" Width="75" Click="button_edithistory_Click" IsEnabled="False" />
                <Button Content="Delete" Height="23" HorizontalAlignment="Left" Margin="269,163,0,0" Name="button_deletehistory" VerticalAlignment="Top" Width="75" IsEnabled="False" Click="button_deletehistory_Click" />
                <Button Height="23" HorizontalAlignment="Left" Margin="62,163,0,0" Name="button_addhistory" VerticalAlignment="Top" Width="75" Click="button_addhistory_Click" Content="Add" IsEnabled="False" />
                <ListView IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ContactHistoryList}" Height="129" HorizontalAlignment="Left" Margin="33,19,0,0" Name="listView_history" VerticalAlignment="Top" Width="419">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Header="Date"  Width="80" DisplayMemberBinding="{Binding ContactHistory_Date}" />
                            <GridViewColumn Header="Type"  Width="80" DisplayMemberBinding="{Binding ContactHistory_Type}" />
                            <GridViewColumn Header="Note"  Width="300" DisplayMemberBinding="{Binding ContactHistory_Note}" />
                        </GridView>
                    </ListView.View>
                </ListView>
            </Grid>
        </GroupBox>
.
.
.
</window>

我正在正确地分配数据上下文,但我的直觉是 xaml 无法理解我提供的所有绑定引用,我可能会丢失一些自定义类引用或类似的东西。如果有人可以在这方面帮助我,我将不胜感激

问候 乌梅尔

【问题讨论】:

  • 您确定数据上下文设置正确吗?因为从这里我看不到任何名为“ContactHistoryList”的属性(这就是您为 ListView 的 ItemsSource 设置的属性。您如何绑定它?
  • 感谢 Tenshiko ,哥们你刚刚解决了我的问题。我没有设置 ItemsSource。我花了将近两个小时来解决这个问题。再次感谢好友。

标签: wpf xaml listview binding


【解决方案1】:

从列表视图中删除绑定参数。

通过代码分配 listview.itemssource。 否则 使用 x:Key="ContactHistoryList" 将 ObjectCollection 添加到资源中

再见

试试这个: <ListView IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding ContactHistoryList}"
Height="129" HorizontalAlignment="Left" Margin="33,19,0,0" Name="listView_history" VerticalAlignment="Top" Width="419">
<ListView.ItemTemplate>
<DataTemplate>
<ListViewItem>
<GridView>
<GridViewColumn Header="Date" Width="80" DisplayMemberBinding="{Binding ContactHistory_Date}" />
<GridViewColumn Header="Type" Width="80" DisplayMemberBinding="{Binding ContactHistory_Type}" />
<GridViewColumn Header="Note" Width="300" DisplayMemberBinding="{Binding ContactHistory_Note}" />
</GridView>
</ListViewItem>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

【讨论】:

  • 但这将如何对应于各个列。比如类的哪个属性应该绑定ListView的哪个GridViewColumn
【解决方案2】:

(你在哪里分配数据上下文?你分配给什么?)

您的代码中的任何地方都没有名为ContactHistoryList 的属性。这意味着您的项目源首先无法正确绑定,除非数据上下文中涉及您未解释的内容。

此外,无法使用 WPF 绑定到公共字段。您需要将字段包装在公共属性中并绑定到这些属性。

【讨论】:

  • 对不起!我只是在试验一些东西并将该代码放在帖子中。 ContactHistoryList 是 Singleton 类的 List 变量。就数据上下文而言,在放置 ListView 的 MainWindow.xaml.cs 文件中,我正在使用 this.DataContext = Singleton.GetInstance() (包含 ContactHistoryList 的单例实例)
  • 而 ContactHistoryList 是一个公共字段,我应该如何将它包装到公共属性中。先生,我很欣赏你的知识,你对理解问题和解决问题有很强的意识。
  • 代替(例如)public int x; 使用public int x { get; set; }
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 2011-12-14
  • 2011-01-14
  • 2014-10-26
  • 2013-01-20
  • 2011-09-20
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多