2013-06-13 37 views
0

我想要做的只是有一個組合框從sqlite表中填充數據。雖然我已經用代碼方法完成了這些工作,但我真的很想在我能看到的更好的WPF方法中做到這一點。如何使用DataContext?

從我瞭解的流動應該是這樣的:

我應該保存的數據的類,我做了一個快速類的默認構造函數是連接到數據庫,並轉儲它的結果像這樣的列表:

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> 

我在做什麼錯在這裏?

+0

您的對象丟失是因爲您從未初始化「作業」列表通過_Jobs = new List ();那麼你可以添加到它。 – DRapp

+0

要添加@DRapp所說的內容,您還應該將其設置爲公開,因爲它可以作爲DataContext的一部分訪問。 –

+0

沒問題,這解決了列表中的問題,但是我仍然沒有在組合框中找到任何東西,我應該使用除{Binding Path = _Jobs}以外的其他類型的datacontext嗎? – Herrozerro

回答

3

結合一個DataContext的東西,它需要通過公共的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。

+0

這樣做給了我「未設置對象實例的對象引用」的舊問題。添加= new ...在成員聲明中給我錯誤。有任何想法嗎? – Herrozerro

+0

@Herrozerro,請參閱修訂答案... – DRapp

+0

謝謝!我認爲我們到了那裏!但組合框給我「由於未知的數據上下文無法解析符號_Jobs。 – Herrozerro