2010-05-01 4 views
0

간단한 데이터베이스 (.sdf)를 콤보 박스에 바인딩하는 방법을 배우려고합니다. 내 테이블에 데이터 세트를 만들었습니다. 그런 다음 DataSource의 테이블을 내 컨트롤로 드래그했습니다. 빌드 경고/오류가 없으며 실행될 때 ComboBox가 비어 있습니다.XAML에서 WPF ComboBox 바인딩 - 왜 비어 있습니까?

<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은 "명칭"이다.

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

을하지만 XAML에서이 작업을 수행하는 방법을 배우고 싶습니다 내가 LINQ to SQL은이 작업을 수행하는 경우, 콤보 상자를 채우는 않습니다. DataGrid를 DataSource에서 드래그했지만 데이터가 채워지지 않았습니다. 어떤 생각?

답변

1

다른 사람들에게 도움이되는 경우 - 저는이 경우 설계자 (DataSet 등에서 테이블 위로 끌어서 이동)를 사용하여 페이지 컨트롤에 바운드 ListBox를 추가하려고 시도했습니다.

위의 팁은 내 메인 창에서 대신 사용해 보았지만 약간의 추가 검사를 한 후에 나는 왜 그런지 알 것입니다.

디자이너와는 부족한 것처럼 보입니다. 창에 컨트롤을 추가 할 때 생성 된 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 참조)

제어는 별도의 페이지 컨트롤에 추가 될 때 그래서, 그러나, 그리고 아마도 UserControl을 등을 위해 그렇게하지 않습니다하지 않았다 중 하나 OP 보고서 내용에 따라

테이블을 채우는 데 생성 된 코드를 사용하는 신속하고 더러운 해결 방법은 창에서 한 번 수행 한 다음 Window_Loaded에서 코드를 가져온 다음 실행 취소하고 다른 컨트롤에 대한 x_Loaded에 연결하는 것입니다 여기에 바운드 컨트롤을 추가합니다.

+0

감사합니다. 내가 해결책을 당신에게로 바꿀거야 :) – mdiehl13

0

.sdf 파일을 완전히 새로운 프로젝트로 가져 와서 DataSet을 재생성하고 ComboBox를 창으로 끌어 왔습니다. 잘 작동합니다!

그런 다음이 프로젝트와 마지막 차이점은 컨트롤이 UserControl에 있다는 사실을 깨달았습니다. 나는 combobox와 함께 usercontrol을 추가하고 컴파일했다. UserControl의 콤보 상자가 비어 있고 주 창의 ComboBox가 올바르게 채워집니다.

0

좋아,이 대답은 나의 이전 대답보다 좋을 것입니다.

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

지금 내 UserControl을이 상황을 알고, 내가 UserControl.xaml에서 다른 컨텍스트 수정 코드를 제거하고 단지 내 Window.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> 

그리고 그렇게해야합니다.