Связывание 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 в главном окне заполнено правильно.