Связывание WPF ComboBox в XAML - почему он пуст? - PullRequest
0 голосов
/ 01 мая 2010

Я пытаюсь научиться связывать мою простую базу данных (.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>

Отображаемые пути являются правильными, выбранный путь - «ID», а путь отображения - «Имя». Если я сделаю это в Linq to Sql, поле со списком заполнится:

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

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

Ответы [ 3 ]

1 голос
/ 12 апреля 2014

В случае, если это помогает другим - я просто столкнулся с этим, в данном случае пытаясь использовать конструктор (перетащите таблицу из 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 для другого элемента управленияв который вы затем добавляете связанный элемент управления.

0 голосов
/ 02 мая 2010

Хорошо, этот ответ НАМНОГО лучше, чем мой предыдущий ответ.В моем файле 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>

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

0 голосов
/ 02 мая 2010

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

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

...