Связывание WPF ComboBox в XAML - почему он пуст?

Я пытаюсь научиться привязывать мою простую базу данных (.sdf) к комбинированному списку. Я создал набор данных с моими таблицами в нем. Затем я перетащил таблицу из источника данных на свой элемент управления. Предупреждений / ошибок сборки нет, и при запуске 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 - "Имя". Если я сделаю это в Linq to Sql, поле со списком заполнится:

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

Но я хотел бы узнать, как это сделать в XAML. Я также перетащил сетки данных из источника данных, но они также не заполнены. Любая идея?

3 ответа

Решение

В случае, если это помогает другим - я просто столкнулся с этим, в этом случае пытаясь использовать конструктор (перетащите таблицу из DataSet и т. Д.), Чтобы добавить связанный ListBox к элементу управления Page.

Совет выше, чтобы попробовать его вместо этого в моем главном окне, сработал, но после некоторого дальнейшего осмотра, я думаю, я понимаю почему.

Кажется, это недостаток с дизайнером; при добавлении элемента управления в окно, в дополнение к сгенерированному 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)

Однако этого не произошло, когда элемент управления был добавлен к отдельному элементу управления Page, и, по-видимому, также не выполняется для UserControl и т. Д., В зависимости от того, что сообщает OP.

Таким образом, быстрый и грязный обходной путь для использования сгенерированного кода для заполнения таблицы состоит в том, чтобы просто сделать это один раз в окне, а затем извлечь код из Window_Loaded, затем отменить и подключить его к x_Loaded для другого элемента управления, в который вы затем добавить связанный элемент управления.

Хорошо, этот ответ намного лучше, чем мой предыдущий ответ. В моем файле Window.xaml мне нужно отправить правильный контекст в элемент управления следующим образом:

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

Теперь, когда мой UserControl знает контекст, я удаляю другой код, изменяющий контекст, из 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>

И это должно сделать это.

Я вытащил свой файл.sdf в совершенно новый проект, восстановил DataSet и перетащил ComboBox в окно. Работает нормально!

Затем я понял, что разница между этим проектом и последним заключалась в том, что элементы управления были в UserControl. Я добавил usercontrol с помощью выпадающего списка и скомпилировал. Поле со списком в UserControl пусто, поле ComboBox в главном окне заполнено правильно.

Другие вопросы по тегам