代码之家  ›  专栏  ›  技术社区  ›  mdiehl13 Ahhhhbisto

在XAML中绑定WPF组合框-为什么它是空的?

  •  0
  • mdiehl13 Ahhhhbisto  · 技术社区  · 14 年前

    我正在尝试学习如何将简单数据库(.sdf)绑定到组合框。我创建了一个包含表的数据集。然后我将一个表从数据源拖到我的控件上。没有生成警告/错误,运行时,组合框为空。

    <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”,显示路径为“name”。如果在Linq to SQL中执行此操作,则组合框将填充:

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

    但我想学习如何在XAML中实现这一点。我也从数据源中拖动了数据报,但它们也没有被填充。有什么想法吗?

    3 回复  |  直到 10 年前
        1
  •  1
  •   user3525457    10 年前

    以防它对其他人有所帮助——我刚刚遇到了这个问题,在本例中,我试图使用设计器(从数据集中拖动一个表等)将绑定的列表框添加到页面控件中。

    上面的小贴士在我的主窗口上试了试,但经过一点进一步的检查,我相信我明白了原因。

    这似乎是设计器的缺陷;在窗口上添加控件时,除了生成的XAML之外,它还生成用于在加载的窗口中填充表的代码块,例如。

    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报告的内容,也可能不会为用户控件等执行此操作。

    因此,使用生成的代码填充表的快速而肮脏的解决方法是在窗口上执行一次,然后从加载的窗口中获取代码,然后撤消并将其插入为另一个控件加载的X中,然后将绑定控件添加到该控件中。

        2
  •  0
  •   mdiehl13 Ahhhhbisto    14 年前

    我将.sdf文件拉入一个全新的项目中,重新生成数据集,并将一个组合框拖到窗口上。很好用!

    然后我意识到这个项目和上一个项目的区别是,控件在一个用户控件中。我添加了一个带有组合框的用户控件并编译。用户控件中的组合框为空,主窗口中的组合框填充正确。

        3
  •  0
  •   mdiehl13 Ahhhhbisto    14 年前

    好吧,这个答案比我以前的答案好多了。在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>
    

    这样就可以了。