2010-05-01 48 views
0

我想學習如何將簡單的數據庫(.sdf)綁定到組合框。我創建了一個包含我的表格的數據集。然後我將數據源中的一個表拖到我的控件上。沒有構建警告/錯誤,當它運行時,組合框是空的。在XAML中綁定WPF組合框 - 爲什麼它是空的?

<UserControl x:Class="OurFamilyFinances.TabItems.TransactionTab" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="414" d:DesignWidth="578" xmlns:my="clr-namespace:OurFamilyFinances" Loaded="UserControl_Loaded_1"> 
<UserControl.Resources> 
    <my:FinancesDataDataSet x:Key="financesDataDataSet" /> 
    <CollectionViewSource x:Key="accountViewSource" Source="{Binding Path=Account, Source={StaticResource financesDataDataSet}}" /> 
</UserControl.Resources> 
<Grid> 
    <ComboBox DisplayMemberPath="Name" Height="23" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource accountViewSource}}" Margin="3,141,0,0" Name="accountComboBox" SelectedValuePath="ID" VerticalAlignment="Top" Width="120"> 
     <ComboBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel /> 
      </ItemsPanelTemplate> 
     </ComboBox.ItemsPanel> 
    </ComboBox> 
</Grid> 

即節目是正確的路徑,則selectedPath是 「ID」 和displaypath是 「名稱」。如果我這樣做是在LINQ to SQL中,組合框不填充:

this.accountComboBox.ItemsSource = from o in db.Account 
              select new { o.ID, o.Name }; 

但我想學習如何在XAML做到這一點。我也從DataSource中拖出了datagrid,但它們也沒有被填充。任何想法?

回答

1

在情況下,它可以幫助別人 - 我只是跑成這樣了,在這種情況下試圖使用設計器(拖在一個表從DataSet等)來綁定列表框添加到頁面控制。

上面的提示來嘗試它,而不是我的主窗口工作,但有點進一步檢查後,我相信我明白爲什麼。

這似乎是與設計師的缺陷;當在窗口上添加控件時,除了生成的XAML之外,它還生成用於在Window_Loaded中填充表的代碼塊,例如,

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    AdventureWorksLTDataSet = ((AdventureWorksProductsEditor.AdventureWorksLTDataSet)(this.FindResource("adventureWorksLTDataSet"))); 
    // Load data into the table Product. You can modify this code as needed. 
    adventureWorksLTDataSetProductTableAdapter = new AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter(); 
    adventureWorksLTDataSetProductTableAdapter.Fill(AdventureWorksLTDataSet.Product); 
    productViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("productViewSource"))); 
    productViewSource.View.MoveCurrentToFirst(); 
} 

(見http://msdn.microsoft.com/en-us/library/dd547149.aspx

沒有這樣做,但是,當控制被添加到一個單獨的頁面控制,想必不會爲一個用戶控件等,這樣做要麼,基於OP報告的內容。

因此,使用生成的代碼來填充表的快速和骯髒的解決方法是在窗口上執行一次,然後從Window_Loaded中獲取代碼,然後撤消並將其插入到x_Loaded中以用於其他控件然後添加綁定的控件。

+0

感謝您的更新!我將切換解決方案爲你:) – mdiehl13 2015-07-07 17:57:35

0

我把我的.sdf文件到一個全新的項目,再生的數據集,並拖着一個ComboBox到窗口。它工作正常!

然後我意識到這個項目之間的差異,最後的是,控制是在用戶控件。我用一個組合框添加了一個用戶控件並進行了編譯。 UserControl中的組合框爲空,主窗口上的ComboBox正確填充。

0

好吧,這個答案是WAY比我以前的答案更好。在我Window.xaml文件,我需要正確的上下文發送到這樣的控制:

 <my:UserControl1 HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="userControl11" VerticalAlignment="Top" DataContext="{Binding Source={StaticResource accountViewSource}}" /> 

現在,我的用戶知道的情況下,我從UserControl.xaml刪除其他方面修改代碼,只是直接使用上下文:

<UserControl x:Class="test3.UserControl1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" xmlns:my="clr-namespace:test3" Loaded="UserControl_Loaded"> 
    <Grid > 
    <ComboBox DisplayMemberPath="Name" Height="23" HorizontalAlignment="Left" ItemsSource="{Binding}" Name="accountComboBox" SelectedValuePath="ID" VerticalAlignment="Top" Width="120"> 
     <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
     </ComboBox.ItemsPanel> 
    </ComboBox> 
    </Grid> 
</UserControl> 

而且應該這樣做。