【问题标题】:How to use DataContext?如何使用数据上下文?
【发布时间】:2013-06-13 00:02:45
【问题描述】:

我想要做的只是让一个组合框填充来自 sqlite 表的数据。虽然我已经使用代码方法完成了这项工作,但我真的很喜欢这样做,因为我认为这是更好的 WPF 做事方式。

据我了解,流程应该是这样的:

我应该有一个保存数据的类,我创建了一个快速类,它的默认构造函数是连接到数据库并将其结果转储到这样的列表中:

internal class mainmenusql
{
    private List<string> _Jobs;

    public mainmenusql()
    {
        SQLiteConnection conn = new SQLiteConnection();
        conn.ConnectionString = "Data Source=C:\\Users\\user\\Documents\\db.sqlite;Version=3";

        try
        {
            conn.Open();
            SQLiteDataReader reader;
            SQLiteCommand command = new SQLiteCommand(conn);
            command.CommandType = CommandType.Text;
            command.CommandText = "SELECT * FROM Tasks";
            reader = command.ExecuteReader();

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    _Jobs.Add(reader.GetValue(0).ToString());
                }
            }
            else
            {
                MessageBox.Show("No records");
            }

        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message);
        }
        finally
        {
            conn.Close();
        }
    }
}

列表“对象引用未设置为对象的实例”时出现一些错误。

不过不管怎样,下一步应该是把表单的DataContext设置为这个对象吧?

    public MainWindow()
    {
        DataContext = new mainmenusql();
        InitializeComponent();
    }

最后组合框应该有绑定权吗?

<Window x:Class="sqliteDatacontext.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox DataContext="{Binding Path=_Jobs}" HorizontalAlignment="Left" Margin="141,124,0,0" VerticalAlignment="Top" Width="120"/>
    </Grid>
</Window>

我在这里做错了什么?

【问题讨论】:

  • 您的对象丢失是因为您从未通过 _Jobs = new List(); 初始化“工作”列表。那么你可以添加它。
  • 要添加到 @DRapp 所说的内容,您还应该将其设为 Public 以便作为 DataContext 的一部分进行访问。
  • 好的,解决了列表的问题,但我仍然没有在组合框中得到任何东西,我应该使用除 {Binding Path=_Jobs} 之外的其他类型的数据上下文吗?跨度>

标签: wpf data-binding datacontext


【解决方案1】:

为了绑定到某个数据上下文,它需要通过公共 getter / setter 公开...

public class mainmenusql
{
    public List<string> _Jobs
    { get ; protected set; }   


    public mainmenusql()
    {
       _Jobs = new List<string>();

       // rest of populating your data
    }
}

窗口控件中的绑定是 ItemsSource

<ComboBox ItemsSource="{Binding Path=_Jobs}" />

“DataContext”应用于整个窗口...以此为基础,您的任何控件都可以将其元素“绑定”到您的数据上下文中“公开”可用的几乎任何东西...在这种情况下,选择的 ComboBox 列表来自其“ItemSource”属性...所以您希望 ITEMSOURCE 指向您的 _Jobs。

【讨论】:

  • 这样做给了我“对象引用未设置为对象实例”的老问题。添加 = new ... 在成员声明中给我错误。有什么想法吗?
  • 谢谢!我想我们快到了!但是组合框给了我“由于未知的数据上下文,无法解析符号_Jobs。
  • 谢谢!这完美!我很高兴我至少在正确的轨道上,我想我现在更好地理解了这一点。
猜你喜欢
  • 2011-02-21
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
相关资源
最近更新 更多